Сериализация (сериализация) в C #

Сериализирането - процес на преобразуване на обект или група обекти, свързани с потока от байт или набор от XML възли, за да спаси (на база данни, файл и т.н.) или предаване (например, по мрежа). Deserialization - обратен процес - възстановяването от обект или XML възли байт поток. Сериализирането обикновено се използва за прехвърляне на обекти през границата с мрежа или приложение, за да спаси обектите в рамките на файла или базата данни, както и дълбоко копие на обекти.

Класове за сериализация подредени в две пространства от имена: System.Runtime.Serialization и System.Xml.Serialization.

механизъм сериализация

4 механизъм на разположение за сериализация в .NET:

  • serializer договор данни
  • двоичен serializer
  • XML serializer (XmlSerializer)
  • IXmlSerializable интерфейс

Първите три са готови механизми за сериализиране и да правят всичко сами работата, IXmlSerializable интерфейс включва прилагане механизъм сериализация самостоятелно.

Наличието на три различни механизми за сериализация е исторически.

Serializer на тези договори е най-новият и многофункционален. Може да се използва в обмена на информация чрез протоколи за съобщения. Той също така предоставя добри версии на поносимостта и позволява deserialized данни, получени от по-ранна или по-късна вид, се дължи на факта, че премахва връзката между данните за ниско ниво на структурата на обектите и да се обединяват данните. Serializer от тези договори могат да бъдат използвани в по-голямата част от задачите, вместо в двоичен и XML serializer.

Binary serializer лесен за използване и добре автоматизирано поддържа през целия .NET. Remoting използва бинарна сериализация инфраструктура, в това число взаимодействието между двете приложения домените в същия процес. Binary serializer работи по-бързо, отколкото serializer договорната данни, но осигурява по-ниско толерантност като създава тесни връзки между структурата на вътрешната тип с формата на сериализирани данни. Той също така не може да се използва за генериране на XML.

XmlSerializer може да генерира XML само, и в сравнение с други механизми, то е по-малко функционален с сериализация на сложни групи от обекти. Въпреки това, във връзка с XML осигурява най-голяма функционалност, и осигурява добра поносимост версии.

Изпълнение IXmlSerializable интерфейс поема оперативната отговорност за сериализация с XmlReader и XmlWriter.

Изводът от тези договори serializer и двоичен serializer се прави с приставка за форматиране. резултати за форматиране формират окончателния вид, в съответствие с конкретната среда или контекст сериализация. Има два форматиране: XML форматиране и двоичен за форматиране. XML форматиране използва kontekset четене / запис на XML, текстовия файл и поток, SOAP съобщения. Binary форматиране се използва в контекста на произволен поток байтове. Binary размер изход обикновено е по-малък от XML, понякога значително. Теоретично serialzitsii механизъм не е свързан с устройството за форматиране, но на практика тези договори serializer използва XML за форматиране и двоичен serializer - двоичен форматиране.

serializer договор данни

Използването serializer тези договори включва следните три стъпки

  • изберете класа да използвате: DataContractSerializer или NetDataContractSerializer
  • добавете Serializable видове и членове на атрибутите [DataContract] и [DataMember] (съответно)
  • създаде инстанция на serializer и се обадете на неговите методи или WriteObject ReadObject

Има два договора данни serializer:

  • DataContractSerializer - осигурява слабо свързване на .NET типове типове данни на договори. Може да генерира които отговарят на стандартите XML. Изисква предварителна регистрация изрични сериализирани получени видове, за да може да сравни имената на договорните данни с имената на .NET типове
  • NetDataContractSerializer - характеризира със здраво свързване на .NET типове типове данни на договорите, не изисква изрично регистрация поредица получени видове, тъй като независимо пише трите имена и видовете възли сериализирани видове

След избиране на serializer е необходимо за всички видове Serializable за добавяне на атрибут [DataContract]. и техните членове, да включват в сериализация - атрибути [DataMember]:

сериализация куки

Непосредствено преди и след сериализация или deseralizatsii може да изпълнява специален метод. Попитайте този метод, с помощта на следните характеристики:

  • [OnSerializing] - определя метода да се позове преди сериализиране
  • [OnSerialized] - определя метода да се позове когато сериализиране
  • [OnDeserializing] - определя метода да се обади преди deserialization
  • [OnDeserialized] - определя метода да се позове след deserialization

Този метод трябва да вземе един единствен параметър от тип StreamingContext. но е необходимо само за да не се използва съгласуваност с бинарна сериализация механизъм, договорите за serializer данни.

От serializers не изпълняват конструктори и инициализират, когато deserializing, тези методи могат да бъдат използвани като строители или полеви инициализират по време deserialization за определяне на стойностите на членовете изключени от сериализация, защото, без да го изключва от членовете на сериализация ще получите когато deserializing стойностите по подразбиране за техните видове, но не и тези, ценности, които са им възложени в конструкторите и инициализират.

Методи могат да бъдат както публични, така и частни. Определени видове могат да определят куките им и те също са причинили budt.

Подкрепа за бинарна сериализация механизъм

Serializers тези договори могат също да издавам видове отбелязани [Serializable] атрибут и прилагат ISerializable интерфейс. В този случай, няма промяна в двоичен сериализация, но много механизми за работа ка с двоичен сериализация: отчита атрибутите [NonSerialized]. извършва GetObjectData методи и конструктори deserialization.

Не е позволено да се използват и двете от тези договори качества и атрибути на бинарна сериализация.

двоичен serializer

Направи тип подкрепя бинарна сериализация по два начина:

  • добавете типа атрибут [Serializable]
  • изпълнение на интерфейса ISerializable в класа

Добавяне на атрибут е по-лесно, но изпълнението на интерфейса осигурява повече възможности.

Умение [Serializable]

Направи тип Serializable възможно само с един атрибут:

Атрибутът [Serializable] serializer показва необходимостта от включване на всички полета от този вид, обществени и частни, но не включват свойства.

Във всяко поле трябва да бъде Serializable тип, т.е. Типове атрибут, както е маркирано [Serializable]. или изпълнява интерфейс ISerializable. Примитивни типове и много други видове .NET са Serializable.

Serializable атрибут не се предава по наследство, така получени клас, не са автоматично Serializable ако не е изрично атрибут Serializable маркер.

Тип имоти не са сериализирани, но да се обединяват с тях автоматично генерирани полета (за съжаление, тези полета могат да бъдат преименувани прекомпилиране).

Извършване двоичен сериализация

За да изпълните бинарна сериализация форматиране, трябва да се създаде обект и да се извика методът му издавам. За двоичен сериализация форматиране предвижда две:

  • BinaryFormatter - по-ефективно, генерира малък извод за по-малко време. Определена в имената на космически System.Runtime.Serialization.Formatters.Binary
  • SoapFormatter - поддържа основния съобщения, по-малко функционален, не поддържа сериализация на основни видове и филтрирате външни данни. Определена в имената на космически System.Runtime.Serialization.Formatters.Soap

И двете използват един и същ за форматиране:

Когато пресъздава предмети deserializer игнорира всички дизайнери.

Поредица данни включва пълна информация за вида и монтажа, така че ако се опитат desereializatsii олово тип към съвместим тип, възниква грешка. Deserializer възстановява референции за обекти за първоначалното им състояние.

Binary serializers също подкрепиха атрибути [OnSerializing]. [OnSerialized]. [OnDeserializing] и [OnDeserialized]. Използването им не се различава от договорите за serializers данни.

Умение [NonSerialized]

За разлика от тях serializers данни договори, които трябва да бъдат етикетирани атрибути на всички Serializable поле, двоичен serializer, която не изисква, и по подразбиране включва всички области сериализирани обект. Изключване на отделните области на сериализация консерва отбележи своя атрибут [NonSerialized]:

Това показва, че serializer не се хвърли изключение, ако не се срещат в полетата, маркирани с потока от поредица данни и просто да се предположи, че областта не е поредица и я оставете празно (това може да се задава стойност по метода на [OnDeserializing]).

VersionAdded аргумент - е цяло число, увеличава всеки път, когато добавяте нов тип голф. По-скоро е само за справка и не влияе на сериализация.

Като цяло, за да се поддържа версии са съветвани да избягват преименуване, изтриване и промяна на вида на полета.

Когато BinaryFormatter когато deserializing открива поле поредица данни поток, който не е обявен в класа, той просто се изхвърли и SoapFormatter sgenenriuet изключение.

ISerializable интерфейс

Изпълнението на ISerializable тип интерфейс осигурява пълен контрол върху начина, по който се произвежда двоична поредица и deserialized. Определението на интерфейс е, както следва:

В примера SerializationInfo обект стойности на ключовете съвпадат с имената на полетата в класа, но това не е необходимо: Допустимо е да се използват никакви ключове низови, при условие че конструктора на deserialization ще можете да ги конвертирате в имената на полетата. Действителните стойности могат да се прилагат за всеки тип Serializable: рекурсивни сериализация ще се извършва, ако е необходимо. Позволено е също така, ако стойността в речника е нула.

Препоръчително е да се декларира метод като GetObjectData виртуално. така че, получени класове могат да удължат сериализация отново без прилагане на основата на интерфейса ISerializable.

Клас SerializationInfo също включва свойства позволяват контрол върху вида и сглобяването, в която deserialized случай да бъде поставен.

параметър StreamingContext - това struktrura на от други, съдържащи стойност ENUM, което показва, когато пристигне сериализирани модел.

В допълнение към изпълнението на интерфейса ISerializable. вида на собствената сериализация deserialization мениджър трябва да съдържа конструктор, който взема два параметъра са същите като методът GetObjectData. Тя може да бъде обявена с всеки модификатор за достъп.

В продължение на няколко вида SerializationInfo клас има специални методи Получи *. например, GetString. за по-удобно изготвяне на ключови ценности. Ако SerializationInfo обект няма значение с искания клавиш, той ще бъде изхвърлен.

XML serializer

пространство на имената на System.Xml.Serialization определено друго serializer - XmlSerializer. Тя ви позволява да издавам вида на XML файлове. Подобно на двата подхода е на разположение в двоичен сериализация:

  • Добавяне на атрибути от типа на име пространство System.Xml.Serialization
  • IXmlSerializable изпълнение интерфейс

Разликата от изпълнението на сериализацията IXmlSerializable интерфейс двоичен елиминира използването на вградения serializer, оставяйки на разработчика писмено самостоятелно сериализация код чрез XmlReader и XmlWriter.

Извършване на XML сериализацията