2011-10-03 12 views
5

dzieje z moim dążeniu do zginać protobuf netto do własnej woli ..Ograniczenie dziedziczenie „drzewo” protobuf netto

Widziałem kilka pytań wokół SO, w jaki sposób dodać podklasy dynamicznie dla serializer, aby móc kodować podklasę, np. this lub this

Moja sytuacja jest nieco inna, mam klasę podstawową, która może zostać poddana podklasie w kodowaniu późno-ograniczonym, i chcę serializować jest klasą BASE i całkowicie ignoruje pola/właściwości podklasy.

Powodem, dla którego tego potrzebuję, jest to, że później, gdy deserializuję dane, kod podklasy nie będzie nawet dostępny, więc skonstruowanie podklasy nie będzie nawet możliwe.

Czy istnieje sposób ograniczenia/zakazu serialiowania podklas?

W moim przypadku mam listę, w której niektóre pozycje na liście to DerivedClass.

Chciałbym znaleźć sposób, aby protobuf netto serializacji wszystko jako klasy bazowej i deserializacji do klasy bazowej, jak również ...

Próbowałem zaglądając do kodu, ale nie znalazłem czegoś zbyt użyteczny .

Odpowiedz

2

Zazwyczaj biblioteka jest bardzo konkretna w wykrywaniu klas pochodnych i traktowaniu ich inaczej niż w klasie bazowej. Jedynym wyjątkiem od tego jest klasa proxy, w szczególności Entity Framework i NHibernate. W przypadku rozwiązania tidy wydaje się praktyczne dodanie pewnego rodzaju przełącznika "ignoruj ​​podklasy". Ale póki co nie istnieje, bardzo leniwy (i hacky) podejście byłoby oszukać za pomocą istniejącego obsługi dla NHibernate, na przykład:

namespace NHibernate.Proxy { 
    interface INHibernateProxy {} 
} 
... 
public class SomeDerivedType : BaseType, INHibernateProxy {} 

ten będzie następnie automatycznie szeregowane według BaseType. Mimo to ma lekki powiew oszukiwania.

+0

Lekki powiew mówisz? ;) Myślę, że włamie się do źródła Coe, ale dzięki za propozycję – damageboy

+1

@damageboy jeśli chcesz dodać do tego jakiś niestandardowy mechanizm, warto przyjrzeć się 'TypeModel.ResolveProxies'. Nie jestem przeciwny dodawaniu tutaj specyficznego API protobuf-net. –

+0

Tak więc jesteśmy tutaj jasne ... Powodem, dla którego kierujesz mnie do ResolveProxies jest to, że jest wywoływany z ThrowUnexpectedSubtype jako ostateczność przed wyrzuceniem wyjątku? – damageboy