2012-10-20 14 views
21

Przykro mi, jeśli jest to duplikat. Przeszukałem kilka miejsc na odpowiedź, że mogę zrozumieć, w tym:Jak szeregować odziedziczoną klasę za pomocą ProtoBuf-Net

ProtoBuf.net Base class properties is not included when serializing derived class

Serialize inherited classes using protobuf-net

Przepraszam, ale ja naprawdę nie rozumiem odpowiedzi. Szukam szybszego, bardziej kompaktowego serializatora binarnego, a ProtoBuf wygląda na to, że może to być odpowiedź. Muszę serializować zestaw klas, które wszystkie pochodzą z jednej klasy bazowej. Jest ich duża liczba, więc przed przystąpieniem do edycji kodu zajęć przeprowadziłem prosty test. Ponadto nie chcę modyfikować klas w żaden sposób, który mógłby wpłynąć na deserializację starszych, utrwalonych plików wygenerowanych przy pomocy serializatora binarnego NET.

Jest to klasa bazowa:

[ProtoContract] 
    public class BaseClass 
    { 
     [ProtoMember(1)] 
     public string Name 
     { 
      get; set; 
     } 
     [ProtoMember(2)] 
     public int Age 
     { 
      get; set; 
     } 
    } 

Jest to klasa pochodna:

[ProtoContract] 
    public class SubClass1 : BaseClass 
    { 
     [ProtoMember(3)] 
     public string Town 
     { 
      get; set; 
     } 

     [ProtoMember(4)] 
     public Sex Sex 
     { 
      get; set; 
     } 
    } 

Jest to kod do serializacji i deserializacji (zaczerpnięte bezpośrednio z Getting Started Guide

var person = new SubClass1 { Age = 25, Name = "Fred", Town = "Denbigh", Sex = Sex.Female }; 

      using (var file = File.Create(filename)) 
      { 
       Serializer.Serialize(file, person); 
      } 

i de-usrializować:

SubClass1 newPerson; 
      using (var file = File.OpenRead(filename)) 
      { 
       newPerson = Serializer.Deserialize<SubClass1>(file); 
      } 

      MessageBox.Show(newPerson.Name + 
       " : " + newPerson.Town + 
       " : " + newPerson.Age.ToString() + 
       " : " + newPerson.Sex); 

Rezultatem jest ": Denbigh: 0: Female"

Jakoś wartości z właściwości klasy bazowej nie są w odcinkach? Pierwotnie testowałem to z indeksami ProtoMember dla klasy pochodnej jako 1, 2. Sądziłem, że to nie zadziała, więc poszedł na 3, 4. Wydaje się, że nie robi różnicy. W mojej paranoi wpadłem sam test z wykorzystaniem standardowego NET serializatora binarnego i dostał oczekiwany rezultat: „Fred: Denbigh: 25: Kobieta”

Czego mi brakuje proszę?

Odpowiedz

21

trzeba użyć atrybutu ProtoInclude na swojej klasy bazowej:

[ProtoContract] 
[ProtoInclude(500, typeof(SubClass1))] 
public class BaseClass 
{ 

arg id (500 w powyższym przykładzie) powinna być unikalna dla tej klasy. Aby uzyskać więcej informacji, zobacz artykuł this

+0

dziękuję bardzo - tak proste – ScruffyDuck

+1

Zapisuje mi pisać, ta –

+0

link wydaje się być uszkodzony ... – RenniePet

1

Wiem, że jest dość stary, ale może pomóc komuś. W niektórych przypadkach można rozwiązać ten problem poprzez przekształcenie własności bazowych w podtyp:

[ProtoContract] 
public class SubClass1 : BaseClass 
{ 
    [ProtoMember(1)] 
    public string BaseName 
    { 
     get{return base.Name;} 
     set{base.Name = value;} 
    } 

    ... 

    [ProtoMember(3)] 
    public string Town 
    { 
     get; set; 
    } 

    [ProtoMember(4)] 
    public Sex Sex 
    { 
     get; set; 
    } 
} 
+0

Nie sądzę, że to zadziała, ponieważ 'SubClass1' będzie miał dwie właściwości zdefiniowane jako' ProtoMember' z indeksem = 1 ('Name' i' BaseName') – BaltoStar

Powiązane problemy