Protobuf-net r282 在反序列化使用 r249 序列化的对象时遇到问题

Posted

技术标签:

【中文标题】Protobuf-net r282 在反序列化使用 r249 序列化的对象时遇到问题【英文标题】:Protobuf-net r282 having problems deserializing object serialized with r249 【发布时间】:2010-09-08 23:48:15 【问题描述】:

我刚刚从 r249 更新到 r282。除了替换 dll 我没有做任何改变。不幸的是,现在反序列化更新之前创建的对象需要更长的时间。过去需要两秒钟的时间现在需要五分钟。

版本之间有语法变化吗?有什么它不再支持的吗?

我的课程都在使用 ProtoContract、ProtoMember 和 ProtoInclude。我正在运行 VS2010。就我而言,我的协议缓冲区代码没有问题。我只是想升级,因为我认为拥有最新版本是件好事。

编辑 - 2010.09.09 我的对象的一个​​属性是一个 ushorts 数组。我刚刚注意到这个属性没有用 r282 正确序列化/反序列化。数组的结果值全为零。该数组在序列化 (r282) 之前具有值,但在反序列化 (r282) 之后没有值。

【问题讨论】:

详情请见related blog entry 【参考方案1】:

事实证明,尽管我努力,是的,在早期版本之一中,数据格式发生了重大变化。这只会影响ushort 数据,该数据在处理中曾一度被忽略。这很遗憾,但好消息是没有数据丢失 - 只是访问有点不方便(目前基本上是通过字符串写入的)。

这是我建议的解决方法;对于这样的成员:

[ProtoBuf.ProtoMember(1)]
public ushort[] Data get;set;

替换为:

[ProtoBuf.ProtoMember(1)]
private string[] LegacyData get;set;

private bool LegacyDataSpecified  get  return false;  set   

/* where 42 is just an unused new field number */
[ProtoBuf.ProtoMember(42, Options = MemberSerializationOptions.Packed)]
public ushort[] Data  get; set; 

[ProtoBuf.ProtoAfterDeserialization]
private void SerializationCallback()

    if (LegacyData != null && LegacyData.Length > 0)
    
        ushort[] parsed = Array.ConvertAll<string, ushort>(
            LegacyData, ushort.Parse);
        if (Data != null && Data.Length > 0)
        
            int oldLen = parsed.Length;
            Array.Resize(ref parsed, parsed.Length + Data.Length);
            Array.Copy(Data, 0, parsed, oldLen, Data.Length);
        
        Data = parsed;
    
    LegacyData = null;

这会将旧式数据导入LegacyData,并在序列化期间(之后)将其合并,或者从Data写入新式数据。更快、更小,并且支持新旧数据。

【讨论】:

@Dan - 好的,这有帮助。我今天要上交,但明天会调查这个。很奇怪! @Dan - 我现在正在看它;抱歉,有很多竞争时间压力 @Dan - 查看更新;使用 v1 分支和发布的 dll 进行测试。您能否提供更多背景信息,以便我重现失败的案例? 我已向您发送了一封包含更多详细信息的电子邮件。

以上是关于Protobuf-net r282 在反序列化使用 r249 序列化的对象时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

ProtoBuf-NET 的 OnDeserialized 属性

protobuf-net 反序列化错误 无效标签:0

了解 Protobuf-net 属性的序列化和反序列化

protobuf-net 子消息未正确读取

protobuf-net 使用啥基本序列化器来输出字节数组?

使用 protobuf-net 序列化具有接口类型成员的类