2014-01-24 6 views
5

Ich habe jetzt diese ein wenig gegoogelt, aber nicht in der Lage gewesen allgemein zu bestimmen, ob protobuf-net oder protobuf in Vorwärtskompatibilität in folgendem Sinne unterstützt:protobuf-net zu halte Zukunftsfelder

Eine ältere Version des Objekts deserialisiert eine neue Version des Objekts mit einem neuen Feld, behält dieses Feld bei der Serialisierung jedoch bei, sodass die neue Version des Objekts den Wert nicht verliert.

Ist dies mit Protobufs möglich?

Vielen Dank

Antwort

5

Ja; Rundum-Auslösen unbekannter Daten wird von den meisten Protobuf-Implementierungen unterstützt. Da Sie speziell getaggt haben - wenn Sie Code zuerst verwenden (d. H. Klassen manuell schreiben, was bei protobuf-net ziemlich üblich ist), dann müssen Sie dies ausdrücklich unterstützen. Der einfachste Weg, dies zu tun, ist Extensible zu erben. Die folgende Abbildung zeigt einen erfolgreichen Umlauf über einen Typ, der nichts vom Feld kennt:

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

Ausgezeichnet danke Marc! Und gute Arbeit mit dem Hafen. Genießen Sie es zu benutzen! – Damian