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=] 是特殊的:它与 或 常规 null
或 T
的盒子装箱,而不是 T?
的盒子;换句话说:object
值 never 包含可为 null 的 value-type。因此,从图书馆的角度来看,您发送了 ConsoleColor
,而不是 ConsoleColor?
,因此:
Type Resolver(int fieldNumber)
{
return typeof(ConsoleColor);
}
作为旁注,虽然:解析器 API 非常 特定且小众,通常 更好做事的方法。如果您能告诉我您想要实现的目标,我可能会提供更多指导。
(我正在考虑是否存在 曾经 解析器可以有意义地 return 一个 typeof(Nullable<T>)
的场景 T
- 我们 可以 或许让库直接解包 nullable 本身,或者提出更有意义的消息)
此代码重现了问题:
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=] 是特殊的:它与 或 常规 null
或 T
的盒子装箱,而不是 T?
的盒子;换句话说:object
值 never 包含可为 null 的 value-type。因此,从图书馆的角度来看,您发送了 ConsoleColor
,而不是 ConsoleColor?
,因此:
Type Resolver(int fieldNumber)
{
return typeof(ConsoleColor);
}
作为旁注,虽然:解析器 API 非常 特定且小众,通常 更好做事的方法。如果您能告诉我您想要实现的目标,我可能会提供更多指导。
(我正在考虑是否存在 曾经 解析器可以有意义地 return 一个 typeof(Nullable<T>)
的场景 T
- 我们 可以 或许让库直接解包 nullable 本身,或者提出更有意义的消息)