C# protobuf网络:类型更改时的向后兼容性?

C# protobuf网络:类型更改时的向后兼容性?,c#,versioning,protobuf-net,C#,Versioning,Protobuf Net,当成员类型发生更改时,是否有办法提供向后兼容性?例如,类Person包含一个整数的版本1,但包含字符串的版本2。我知道这违反了合同,但这个例子在实际软件开发中并不少见 提前谢谢 // Version 1 [ProtoContract] class Person { [ProtoMember(1)] public int ID { get; set; } } // Version 2 [ProtoContract] class Person { [ProtoMembe

当成员类型发生更改时,是否有办法提供向后兼容性?例如,类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; }
}

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

// 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”更改为“int”时,这不是一个合同中断吗?2.没有空的序列化?我担心在我的二进制文件中会有很多旧的“垃圾”。我也担心反序列化:即使它是IDUV1是空的,它可能浪费内存,或者我错了吗?@ Goint 1)不,原Buffnet网不会考虑<代码> int >代码>代码> int >代码>,因为在OrthBuf层(WEB规范),这只是一个可选的<代码> int <代码>;2) 在protobuf层,没有
null
的概念-同样,它将被简单地视为一个可选值,其中
null
表示“不要写这个”,因此如果它在流中,它将被读取,但永远不会被写入。所以它永远不会占用流中的任何内存,因为没有字段,所以它不会占用对象中的任何内存。谢谢你的快速回答。恭喜你,你做了一件了不起的工作。