protobuf-net:序列化和反序列化具有长度前缀的可空枚举中的 ProtoException

protobuf-net: ProtoException in serializing and deserializing nullable enum with length prefix

此代码重现了问题:

Type Resolver(int fieldNumber)
{
    return typeof(ConsoleColor?);
}

var stream = new MemoryStream();
ConsoleColor? obj = ConsoleColor.Green;
Serializer.NonGeneric.SerializeWithLengthPrefix(stream, obj, PrefixStyle.Base128, 1);

stream.Position = 0;
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, Resolver, out var dd);
//EXCEPTION!!!

我只是序列化一个可为 null 的枚举值。但是当我尝试反序列化时,出现以下异常:

ProtoBuf.ProtoException: Invalid wire-type; this usually means you have over-written a file without truncating or setting the length; see

我做错了什么?有什么办法可以解决或解决这个问题吗?我正在使用 2.4.6 版的 protobuf-net 库。 (无法移动到 3.x,因为我坚持使用 .Net Framework 4.0)。

当您将 Nullable<T> 传递给带 object 的 API 时,它是 boxed,[=] 的装箱规则11=] 是特殊的:它与 常规 nullT 的盒子装箱,而不是 T? 的盒子;换句话说:objectnever 包含可为 null 的 value-type。因此,从图书馆的角度来看,您发送了 ConsoleColor,而不是 ConsoleColor?,因此:

Type Resolver(int fieldNumber)
{
    return typeof(ConsoleColor);
}

作为旁注,虽然:解析器 API 非常 特定且小众,通常 更好做事的方法。如果您能告诉我您想要实现的目标,我可能会提供更多指导。

(我正在考虑是否存在 曾经 解析器可以有意义地 return 一个 typeof(Nullable<T>) 的场景 T - 我们 可以 或许让库直接解包 nullable 本身,或者提出更有意义的消息)