【问题标题】:protobuf-net: Backward compability when type has changed?protobuf-net:类型更改时的向后兼容性?
【发布时间】:2013-08-07 11:44:47
【问题描述】:

当成员类型发生变化时,有没有办法提供向后兼容性?例如,类 Person 包含在一个整数的版本 1 中,但包含在字符串的版本 2 中。我知道这违反了合同,但这个例子在现实生活中的软件开发中并不罕见。

提前致谢。

// Version 1
[ProtoContract]
class Person 
{
    [ProtoMember(1)]
    public int ID { get; set; }
}

// Version 2
[ProtoContract]
class Person 
{
    [ProtoMember(1)]
    public string ID { get; set; }
}

【问题讨论】:

    标签: c# versioning protobuf-net


    【解决方案1】:

    垫片属性可能是您最好的选择:

    // Version 2
    [ProtoContract]
    class Person 
    {
        [ProtoMember(1)]
        private int? ID_v1 {
            get { return null; } // means it won't be serialized
            set { if(value != null) ID = value.ToString(); }
        }
    
        [ProtoMember(2)]
        public string ID { get; set; }
    }
    

    【讨论】:

    • 谢谢,但有两个问题:1. 当我们将类型从“int”更改为“int”时,不是合同中断吗? ?这是否意味着
    • 非常感谢,但是有两个问题: 1. 当我们将类型从'int'更改为'时,这不是合同中断吗诠释? ? 2、有没有null的序列化?我担心我的二进制文件中可能会有很多旧的“垃圾”。我也担心反序列化:即使它的 ID_v1 为空,它可能会浪费内存,还是我错了?
    • @Guenter 1) 不,protobuf-net 不会将 int int? 视为合约中断,因为在 protobuf 层(电线规范)这很简单一个可选的int; 2) 在 protobuf 层,没有 null 的概念 - 再次,它将被简单地视为一个可选值,其中 null 表示“不要写这个”,所以它将被 读取 如果它在流中,但它永远不会被写入。所以它永远不会占用流中的任何内存,并且由于没有字段,它也不会占用对象中的任何内存
    • 感谢您的快速回答。恭喜你 - 你做了一件了不起的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2011-08-28
    • 2019-02-16
    相关资源
    最近更新 更多