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.
Czy są to same pola czy wartość przypisana do tego? –
Czy jest to pole lub wartość przypisana do tego lub obu? –
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 –