[英]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!!!
我只是在序列化一个可为空的枚举值。 但是当我尝试反序列化时,我得到以下异常:
ProtoBuf.ProtoException:线型无效; 这通常意味着您在没有截断或设置长度的情况下覆盖了文件; 见
https://stackoverflow.com/q/2152978/23354
'
我究竟做错了什么? 有没有办法解决或解决这个问题? 我正在使用 protobuf-net 库的 2.4.6 版本。 (无法移动到 3.x,因为我被 .Net Framework 4.0 困住了)。
当您将Nullable<T>
T?
给采用 object 的object
时,它是boxed ,并且Nullable<T>
T
装箱规则是特殊的:它装箱到常规的null
的盒子或TD 的盒子T?
; 换句话说: object
值从不包含可为空的值类型。 因此,从图书馆的角度来看,您发送的是ConsoleColor
,而不是ConsoleColor?
, 所以:
Type Resolver(int fieldNumber)
{
return typeof(ConsoleColor);
}
不过,附带说明一下:解析器 API非常具体和利基,通常有更好的方法来做事。 如果您能告诉我您要达到的目标,我可能会提供更多指导。
(我正在尝试考虑是否存在解析器可以有意义地为某个T
返回typeof(Nullable<T>)
的场景 - 我们也许可以让库只是解开可空值本身,或者引发更有意义的消息)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.