Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






XML/SOAP-СЕРИАЛИЗАЦИЯ






ДВОИЧНАЯ СЕРИАЛИЗАЦИЯ

Для того чтобы некий объект мог быть сериализован, его класс (в самом простейшем варианте) достаточно пометить атрибутом 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.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал