【问题标题】:protobuf-net backward compatibilityprotobuf-net 向后兼容性
【发布时间】:2015-01-19 03:33:41
【问题描述】:

假设我有这个课程:

[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 反序列化为 NewClass? 基本上我想移动一些成员,创建一些容器子类来保存它们,但是我有很多 OldClass 类已经序列化并存储在磁盘上,并且希望能够加载它们。

这些 X、Y、Z 成员并不总是像 int 这样的原始类型。

【问题讨论】:

    标签: .net protobuf-net


    【解决方案1】:

    序列化的OldClass 数据仅包含两个值,XZXY,因为您对两个不同的字段使用相同的成员索引。

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

    【讨论】:

    • 如果我已经将几个 OldClass 以及 NewClass 实例序列化到不同的文件,现在需要反序列化到 NewClass 怎么办?只需添加try{DeserializeToNewClass()}catch(WrongClassException){DeserializeToOldClass(); ConvertOldToNew();} 块?
    • 不确定是否有更好的选择。
    • 以后你应该在文件头中写入版本信息,让你知道文件中的序列化数据到底是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2011-08-28
    • 2020-10-16
    • 2011-02-18
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多