protobuf-net保持未来领域

时间:2014-01-24 11:39:34

标签: protobuf-net protocol-buffers

我现在用谷歌搜索了一下,但是在以下意义上,我们无法确定protobuf-net或protobuf是否支持向前兼容性:

旧版本的对象使用新字段反序列化对象的新版本,但在序列化时保留此字段,因此对象的新版本不会丢失该值。

这可能与protobuf有关吗?

非常感谢

1 个答案:

答案 0 :(得分:7)

是;大多数protobuf实现都支持往返未知数据。由于您专门标记了 - 如果您使用的是代码优先(即手工编写类,这在protobuf-net中非常常见),那么您需要明确地为此提供支持。最简单的方法是继承Extensible。以下显示了一个对该领域一无所知的类型的成功往返:

using System;
using System.IO;
using ProtoBuf;

[ProtoContract]
class Foo
{
    [ProtoMember(1)]
    public int X { get;set; }
    [ProtoMember(2)]
    public int Y { get;set; }
}
[ProtoContract]
class Bar : Extensible
{
    [ProtoMember(1)]
    public int A { get;set; } // if declared, needs to be compatible

    // note we don't have a declared field 2 here
}
static class Program
{
    static void Main()
    {
        Foo orig = new Foo { X = 123, Y = 456 }, clone;
        Bar bar;
        using(var ms = new MemoryStream())
        {
            Serializer.Serialize(ms, orig);
            ms.Position = 0;
            bar = Serializer.Deserialize<Bar>(ms);

            Console.WriteLine(bar.A); // 123 // query known data
            int b = Extensible.GetValue<int>(bar, 2); // query unknown data
            Console.WriteLine(b); // 456
        }
        using (var ms = new MemoryStream())
        {
            Serializer.Serialize(ms, bar);
            ms.Position = 0;
            clone = Serializer.Deserialize<Foo>(ms);
        }
        Console.WriteLine(clone.X); // 123
        Console.WriteLine(clone.Y); // 456
    }
}