2014-01-24 1 views
5

Я гугле немного для этого сейчас, но не в состоянии определить, является ли Protobuf-сеть или Protobuf в целом поддерживает совместимость снизу в следующем смысле:Protobuf-нетто сохраняя будущие поля

старая версия объекта десериализует новую версию объекта с новым полем, но сохраняет это поле при его сериализации, поэтому новая версия объекта не теряет значения.

Возможно ли это с протобуфом?

Many Thanks

ответ

5

Да; неизвестные данные с округленным отключением поддерживаются большинством протобуф-реализаций. Поскольку вы специально отметили - если вы используете первый код (т. Е. Записываете классы вручную, что довольно часто встречается с 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 
    } 
} 
+0

Отличное спасибо Marc! И отличная работа с портом. Пользуясь этим! – Damian

Смежные вопросы