Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
XML/SOAP-СЕРИАЛИЗАЦИЯСтр 1 из 8Следующая ⇒
ДВОИЧНАЯ СЕРИАЛИЗАЦИЯ Для того чтобы некий объект мог быть сериализован, его класс (в самом простейшем варианте) достаточно пометить атрибутом Serializable. Это необходимое и достаточное условие для сохранения данных объекта заданного класса. В некоторых случаях классы содержат поля, хранящие либо постоянные значения, либо значения, которые после сериализации/десериализации могут не иметь смысла, или не могут сохраняться по соображениям безопасности. Такие поля необходимо пометить атрибутом NonSerialized. Например, [Serializable] public class CarEngine { private readonly int engineId; [NonSerialized] public int temperature; public bool TurnOn(); public bool TurnOff(); } Атрибут Serializable НЕ наследуется. Таким образом, если возникает необходимость сериализации классов наследников, каждый из них должен быть помечен соответствующим атрибутом. В противном случае любая попытка обращения к подсистеме сериализации.NET для данного класса будет приводить к исключению SerializationException. Для того чтобы сериализовать приведенный выше класс CarEngine в двоичном виде достаточно написать следующий код: public void SerializeCarTo(string fileName, CarEngine care) { Stream st = new FileStream(fileName, FileMode.Create); IFormatter f = new BinaryFormatter(); f.Serialize(st, care); st.Close(); } а для чтения сохраненного объекта из файла подойдет функция public CarEngine DeserializeCarFrom(string fileName) { Stream st = new FileStream(fileName, FileMode.Open, FileAccess.Read); IFormatter f = new BinaryFormatter(); CarEngine car = f.Deserialize(st); st.Close(); return car; } XML/SOAP-СЕРИАЛИЗАЦИЯ Сериализация программных объектов в формат XML связанно с использованием вместо класса BinaryFormatter другого специального объекта XmlSerializer описанного в пространстве имен System.Xml.Serialization. XML-сериализация производит сохранение только полей и свойств имеющих область видимости public. Сохраняемые свойства должны быть доступны как для чтения, так и для записи, и исключение делается только для свойств поддерживающих интерфейс IList. По умолчанию, сериализатор при записи объекта создает XML следующего вида < тип-объекта> < имя-поля> значение-поля< /имя-поля> ... < /тип-объекта> записывая все public поля, доступные на чтение/запись. Для игнорирования некоторых полей и исключения их из процесса записи можно использовать атрибут XmlIgnoreAttribute выполняющий ту же функцию что и атрибут NoSerialized при двоичной сериализации. В случаях, когда сериализация выполняется в целях обмена информацией с другими системами, или в случаях, когда на XML наложена строгая схема, определяющая имена элементов и атрибутов, имена элементов в XML могут не совпадать с именами полей, объявленных в программных объектах. Для реализации такой возможности предназначен атрибут XmlElementAttribute, изменяющий имя элемента XML-файла. Ещё одной возможностью является запись полей объекта в виде атрибутов вместо полей. public class Book { [XmlAttribute(“Name-Author”)] public string Author = “неизвестен”; public string ISBN; } Результатом будет получен xml-строка следующего вида: <? xml version=" 1.0" encoding=" utf-16"? > < Book Name-Author=" Неизвестен" > < ISBN> 11234< /ISBN> < /Book> Сериализация коллекций производиться по общему формату < имя-поля-коллекции> < тип-элемента-коллекции> поля объекта в коллекции < /тип-элемента-коллекции> < /имя-поля-коллекции> Применяя к полю атрибут XmlArrayAttribute можно заменить имя элемента для поля-коллекции. public class Book { [XmlAttribute(“Name-Author”)] public string Author = “неизвестен”; public string ISBN; [XmlArray(“par-list”), XmlArrayItem(“par”)] public string[] Paragraphs; } Атрибут XmlArrayItemAttribute изменяет соответственно имя элементов, вложенных в основной элемент коллекции. <? xml version=" 1.0" encoding=" utf-16"? > < Book Name-Author=" Неизвестен" > < ISBN> 11234< /ISBN> < par-list> < par> 1< /par> < par> 2< /par> < /par-list> < /Book> Надо учитывать, что если коллекция может содержать различные классы, то тип каждого из них необходимо указать с помощью параметра type атрибута XmlArrayItem.
|