2010-09-08 111 views
2

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

版本之间是否存在语法更改?有什么它不再支持?

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

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

+0

有关详细信息,请参见[相关博客条目](http://marcgravell.blogspot.com/2010/09/protobuf-net-ushort-glitch-before-r274.html) – 2010-09-20 06:33:08

回答

2

事实证明,尽管我的努力,是的,在早期的版本之一,数据格式发生了突变。这只影响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。更快,更小,同时支持新旧数据。

+0

请阅读原文的补充内容帖子。 – 2010-09-09 18:47:29

+0

@丹 - 好的,这有帮助。我今天即将入场,但明天将进行调查。很奇怪! – 2010-09-09 20:49:34

+0

这有什么更新? – 2010-09-16 18:27:29