繁体   English   中英

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!!!

我只是在序列化一个可为空的枚举值。 但是当我尝试反序列化时,我得到以下异常:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM