2011-12-02 11 views
6

Jak mogę uzyskać v2 protokołu protobuf-net, aby zignorować fakt, że moja klasa implementuje ICollection, IEnumerable, etc?Wymuś protobuf-net, aby zignorować interfejsy IEnumerable/ICollection

Dla tego konkretnego scenariusza chcę tylko, aby pola oznaczone jako [ProtoMember] były serializowane.


Jestem obecnie w trakcie konwersji z używania protobuf-net v1 do używania v2. Mam szczególną strukturę, która teraz jest nieprawidłowo serializowana z powodu zmiany. Wygląda to mniej więcej tak:

[ProtoContract] 
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged { 

    private FileTreeNode _Root; 

    [ProtoMember (1)] 
    public FileTreeNode Root { 
     get { return _Root; } 
     set { _Root = value; } 
    } 
} 

Klasa FileTree został napisany aby zwinąć ścieżki plików typu "C: \ happy.txt" "C: \ history.txt" na coś bardziej jak

"C:\h" 
└─── "appy.txt" 
└─── "istory.txt" 

Struktura eliminuje nadmiarowość w łańcuchach ścieżek. Tak naprawdę, nie chcę, aby klasa FileTree była serializowana za pomocą funkcji IEnumerable, ponieważ wtedy jest przechowywana jako "C: \ happy.txt", "C: \ history.txt", itp. W tej chwili w serializacji obiektu FileTree, każda ścieżka jest drukowana w całości.


EDIT: Ostatnią rzeczą, należy wspomnieć - Mam funkcję On_Deserialization w FileTree który jest oznaczony [ProtoAfterDeserialization]. Stawiam punkt przerwania w działaniu, ale nie zostaje trafiony. Czy jest to związane ze sposobem serializowania tej klasy?

+0

Nie jestem * świadomy *, że była to przełomowa zmiana między wersjami v1 i v2; być może subtelną różnicą jest to, że v1 szukał raczej dla 'IList ' lub kombinacji 'IEnumerable ' ** z ** publicznym 'Add'. –

Odpowiedz

7
[ProtoContract(IgnoreListHandling = true)] 
public class FileTree : ICollection<FilePath> ... 
{ ... } 

powinien to zrobić. Szczerze mówiąc, nie sądzę, abym rozważył oddzwonienia na listach, ponieważ są one traktowane tak bardzo różni się od podmiotów, ale z powyższym powinny działać. Daj mi znać, jeśli nie.

Z dokumentacji intellisense:

Pobiera lub ustawia wartość wskazującą, że tego typu powinny być nie traktuje się jako listy, nawet jeśli ma znajome lista podobną charakterystykę (przeliczalny, dodać itp)

+0

Dziękujemy! Przepraszam, że zawracam ci głowę, gdy odpowiedź była tak oczywista z perspektywy czasu. Szukałem w niewłaściwych miejscach odpowiedzi. – Amanduh

+0

@Amanduh większość rzeczy jest oczywista, gdy znasz odpowiedź - to było dobre i poprawne pytanie, które na szczęście * ma * wygodną odpowiedź (nie było to całkiem niedawno) –

+0

@MarcGravell Zwróć uwagę, że opcja IgnoreListHandling może nie działać zgodnie z oczekiwaniami w nieco bardziej [złożonych] (https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling) [scenariuszach] (https://code.google. com/p/protobuf-net/issues/detail? id = 348 & q = IgnoreListHandling). – tm1

Powiązane problemy