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

C# Protobuf net r282在反序列化用r249序列化的对象时遇到问题,c#,protobuf-net,C#,Protobuf Net,我刚从r249更新到r282。除了替换dll,我没有做任何更改。不幸的是,现在对更新之前创建的对象进行反序列化需要更长的时间。过去需要两秒钟的时间现在需要五分钟 版本之间是否有语法更改?有什么它不再支持的吗 我的类都使用ProtoContract、ProtoMember和ProtoInclude。我正在运行VS2010。就我而言,我的协议缓冲区代码没有问题。我只是想升级,因为我觉得有最新的版本很好 编辑-2010.09.09 我的对象的属性之一是一个ushort数组。我刚刚注意到这个属性没有用r

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

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

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

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

事实证明,尽管我做出了努力,但在一个早期版本中,数据格式确实发生了突破性的变化。这只会影响
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;
}
[ProtoBuf.ProtoMember(1)]
私有字符串[]LegacyData{get;set;}
私有bool LegacyDataSpecified{get{return false;}set{}
/*其中42只是一个未使用的新字段号*/
[ProtoBuf.ProtoMember(42,Options=MemberSerializationOptions.Packed)]
公共ushort[]数据{get;set;}
[ProtoBuf.ProtoAfterDeserialization]
私有void SerializationCallback()
{
if(LegacyData!=null&&LegacyData.Length>0)
{
ushort[]已解析=Array.ConvertAll(
LegacyData,ushort.Parse);
if(Data!=null&&Data.Length>0)
{
int oldLen=已解析的.Length;
Array.Resize(ref-parsed,parsed.Length+Data.Length);
复制(数据,0,已解析,oldLen,Data.Length);
}
数据=已解析;
}
LegacyData=null;
}

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

@Dan-好的,这很有帮助。我今天就要上交了,但明天会调查的。非常奇怪@丹-我现在真的在看它;对不起,比赛时间太多了pressures@Dan-见更新;使用v1分支和发布的dll进行测试。你能提供更多的上下文以便我重现一个失败的案例吗?我已经向你发送了一封电子邮件,其中包含更多详细信息。有关完整的详细信息,请参阅