.net protobuf网络向后兼容性

.net protobuf网络向后兼容性,.net,protobuf-net,.net,Protobuf Net,假设我有一门课: [ProtoContract] public class OldClass { [ProtoMember(1)] int X; [ProtoMember(2)] int Y; [ProtoMember(2)] int Z; } 如果我将OldClass更改为: [ProtoContract] public class NewClass { Container container; [ProtoMember(2)] int Z; } [Proto

假设我有一门课:

[ProtoContract]
public class OldClass
{
   [ProtoMember(1)] int X;
   [ProtoMember(2)] int Y;
   [ProtoMember(2)] int Z;
}
如果我将OldClass更改为:

[ProtoContract]
public class NewClass
{
   Container container;
   [ProtoMember(2)] int Z;
}

[ProtoContract]
public class Container
{
   [ProtoMember(1)] int X;
   [ProtoMember(2)] int Y;
}
有没有办法将旧类反序列化为新类? 基本上我想移动一些成员,创建一些容器子类来保存它们,但是我有很多OldClass类已经序列化并存储在磁盘上,并且希望能够加载它们


这些X、Y、Z成员并不总是像int那样的基本类型。

序列化的
OldClass
数据只包含两个值,或者
X
Z
或者
X
Y
,因为您对两个不同的字段使用相同的成员索引


假设您没有这个问题,您可以只保留
OldClass
,反序列化到
OldClass
,然后在
NewClass
上有一个接受
OldClass
的构造函数。ProtoBuf不需要知道它。

如果我已经将几个OldClass和NewClass实例序列化到不同的文件,现在需要反序列化到NewClass,该怎么办?只需添加
try{DeserializeToNewClass()}catch(错误类异常){DeserializeToOldClass();ConvertOldToNew();}
block?不确定是否有更好的选项。将来,您应该使用版本信息编写文件头,让您知道文件中的序列化数据到底是什么。