2009-05-30 20 views
6

W serializacji (szeregowanie binarne) jakie dane są przesyłane? Instancja klasy (obiekt) lub wartości przypisane do właściwości tego obiektu.Jakie dane są przekazywane w serializacji? (Serializacja binarna)

Chcę wiedzieć, co dzieje się w procesie serializacji? Mam na myśli, że obiekt jest konwertowany na jego plik docelowy lub cokolwiek w serializacji. Ale jak? Jakie kroki są podejmowane w tym procesie?

Czy ktoś może pomóc?

Jay ...

Odpowiedz

1

Domyślnie, tylko pola typu są szeregowane przy użyciu serializacji binarnej. Właściwości są traktowane jako metody i nie mają wpływu na serializację.

Podczas korzystania z serializacji Xml właściwości publiczne są serializowane domyślnie.

+0

Czy są to same pola czy wartość przypisana do tego? –

+0

Czy jest to pole lub wartość przypisana do tego lub obu? –

+0

Do serializacji XML, publiczne pola + właściwości z akcesoriami do odczytu i zapisu; które nie są oznaczone [XmlIgnore]; lub 'IXmlSerializable' ma pierwsze dibs ;-p –

4

Zakładam, że masz na myśli BinaryFormatter; to zależy; -p

Celem serializacji jest wyrażenie złożonego obiektu w pamięci jako prostej sekwencji bajtów (lub w zależności od serializera - znaków, itp.), które mogą być nawadniane na drugim końcu ponownie utworzyć obiekt.

Niektóre typy (prymitywy, łańcuchy, itp.) Mają wbudowane bezpośrednie wsparcie przez serializer - zapisuje je bezpośrednio.

W przypadku klas, metadane typ (incuding montaż wymienić etc) jest napisane, a następnie wszystkie pól typu są wyliczone (zasadniczo Type.GetFields(), w tym prywatnego itp). Dla każdego pola (nie oznaczone [NonSerialized]), nazwa pola jest zapisana, a wartość jest serializowana (przez ten sam proces). Ostatecznie wszystko sprowadza się do wbudowanych prymitywów, niektórych definicji typów i par nazw/wartości pól.

Wyjątkiem jest tutaj, jeśli typ implementuje ISerializable - w takim przypadku typ jest proszony o szeregowanie się z danymi wyjściowymi. Jest to powszechne w typach słownikowych, w których układ w pamięci tego typu może być wyrażony inaczej niż strumień.

Podczas deserializacji proces jest odwrotny; metadane typu są używane do utworzenia pustego obiektu (chyba że ma on specjalny konstruktor serializacji/ISerializable); następnie pola są ustawione tak, jak znajdują się w strumieniu.

W przypadku serializacji i deserializacji istnieją punkty "oddzwaniania", w których można wykonać dodatkowy kod, aby naprawić obiekty do serializacji (de).

Ten proces jest kruchy; z wielu powodów, see here - ale jest to również wersja nietolerancyjna i specyficzna dla implementacji (nie można jej używać z java itp.).

protobuf-net rozwiązuje wiele z tych problemów, będąc binarny serializer że jest oparta na umowie zamiast pole oparte.


+1

Co z właściwościami automatycznymi, czy ich pola bazowe są serializowane? Och, od kiedy wspomniałeś protobuf-net, oto link: http://code.google.com/p/protobuf-net/ – M4N

+1

ponownie właściwości automatyczne: tak, są; ale to jest * szczególnie * kruchej, patrz link "zobacz tutaj", dlaczego. Będę edytować, aby umieścić łącze protobuf-net, ale na tyle zabawnie już to znam ;-p –

+0

Dzięki. BTW: Wiedziałem, że TY znałeś link, dodałem go dla innych czytelników :) – M4N

5

Serializacja binarna wykonuje zdjęcie obiektu i serializuje je. Oznacza to, że wszystkie prywatne pola, które nie są oznaczone jako NonSerializable, będą serializowane według ich wartości. Wszystkie obiekty używane w hierarchii obiektów muszą być oznaczone jako Serializable. Należy umieścić [field: NonSerializable] atrybut na imprezach, więc obsługi zdarzeń nie dostać zbyt odcinkach: http://bytes.com/groups/net-c/250944-nonserialized-attribute-events#post1013968

Należy pamiętać, że podczas deserializacji obiektu, trzeba mieć dokładnie ten sam obiekt w tym samym zespole, jak podczas serializowane (to samo znaczenie same informacje o montażu). Jeśli nie, możesz użyć klasy SerializationBinder, aby można było zresetować typ, w którym strumień będzie sterylizowany.

+1

Tak! Ten atrybut [field: NonSerializable] jest bardzo dobry do poznania. Kod daje tylko pozorny wyjątek Serialization Exception, gdy nie używasz atrybutu zdarzenia, pozostawiając Cię całkowicie w ciemności, dlaczego wyjątek został zgłoszony. – Dabblernl

+0

Pedant: [field: NonSerializable] ma zastosowanie tylko do "zdarzeń polowych"; w przypadku innych implementacji zdarzeń (jawne pole, EventHandlerList, itp.) pole to można oznaczyć bezpośrednio. –

+0

literówka: sterlizowana? –

Powiązane problemy