Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Сериализация XML — это процесс преобразования общедоступных свойств и полей объекта в последовательный формат (в данном случае XML) для хранения или транспорта. Десериализация повторно создает объект в исходном состоянии из выходных данных XML. Сериализация можно рассматривать как способ сохранения состояния объекта в потоке или буфере. Например, ASP.NET использует XmlSerializer класс для кодирования сообщений веб-службы XML.
Данные в объектах описываются с помощью таких конструкций языка программирования, как классы, поля, свойства, примитивные типы, массивы и даже внедренные XML в форме XmlElement или XmlAttribute объекты. Вы можете создавать собственные классы, аннотировать атрибутами или использовать средство определения схемы XML (Xsd.exe) для создания классов на основе существующего документа определения схемы XML (XSD). Если у вас есть XML-схема, можно запустить Xsd.exe для создания набора классов, строго типизированных в схему и аннотированных атрибутами, которые соответствуют схеме при сериализации.
Для передачи данных между объектами и XML требуется сопоставление конструкций языка программирования со схемой XML и наоборот. Инструменты XmlSerializer и связанные с ними, такие как Xsd.exe, обеспечивают связующее звено между этими двумя технологиями как на этапе проектирования, так и во время выполнения. Во время разработки используйте Xsd.exe для создания xml-документа схемы (XSD) из пользовательских классов или для создания классов из данной схемы. В любом из случаев классы аннотируются пользовательски атрибутами, чтобы указать XmlSerializer, как сопоставить схему XML с общей языковой средой выполнения. Во время выполнения экземпляры классов можно сериализовать в XML-документы, которые соответствуют заданной схеме. Аналогичным образом эти XML-документы можно десериализировать в объекты среды выполнения. Обратите внимание, что схема XML является необязательной и не требуется во время разработки или во время выполнения.
Контроль сгенерированного XML
Для управления созданным XML можно применять специальные атрибуты к классам и членам. Например, чтобы указать другое имя для XML-элемента, примените XmlElementAttribute к общедоступному полю или свойству и задайте свойство ElementName. Полный список аналогичных атрибутов см. в разделе Атрибуты, управляющие сериализацией XML. Вы также можете реализовать IXmlSerializable интерфейс для управления выходными данными XML.
Если созданный XML-код должен соответствовать разделу 5 документа Всемирного консорциума, протоколу простого доступа к объектам (SOAP) 1.1, необходимо создать XmlSerializer с помощью XmlTypeMapping. Для дальнейшего управления кодированным SOAP XML используйте атрибуты, перечисленные в Атрибутах, которые управляют кодированной сериализацией SOAP.
XmlSerializer вы можете использовать преимущества работы с строго типизированными классами и при этом сохранять гибкость XML. Используя поля или свойства типов XmlElement, XmlAttribute или XmlNode в строго типизированных классах, можно считывать части XML-документа непосредственно в XML-объекты.
При работе с расширяемыми XML-схемами можно также использовать атрибуты XmlAnyElementAttribute и XmlAnyAttributeAttribute для сериализации и десериализации элементов или атрибутов, которые не найдены в исходной схеме. Чтобы использовать объекты, примените XmlAnyElementAttribute к полю, которое возвращает массив XmlElement объектов, или примените XmlAnyAttributeAttribute к полю, которое возвращает массив XmlAttribute объектов.
Если свойство или поле возвращает сложный объект (например, массив или экземпляр класса), XmlSerializer он преобразует его в элемент, вложенный в основной XML-документ. Например, первый класс в следующем коде возвращает экземпляр второго класса.
Public Class MyClass
Public MyObjectProperty As MyObject
End Class
Public Class MyObject
Public ObjectName As String
End Class
public class MyClass
{
public MyObject MyObjectProperty;
}
public class MyObject
{
public string ObjectName;
}
Сериализованные выходные данные XML выглядят следующим образом:
<MyClass>
<MyObjectProperty>
<ObjectName>My String</ObjectName>
</MyObjectProperty>
</MyClass>
Если схема содержит элемент, который является необязательным (minOccurs = "0") или если схема содержит значение по умолчанию, у вас есть два варианта. Один из вариантов — указать System.ComponentModel.DefaultValueAttribute значение по умолчанию, как показано в следующем коде.
Public Class PurchaseOrder
<System.ComponentModel.DefaultValueAttribute ("2002")> _
Public Year As String
End Class
public class PurchaseOrder
{
[System.ComponentModel.DefaultValueAttribute ("2002")]
public string Year;
}
Другим вариантом является использование специального шаблона для создания логического поля, распознаваемого XmlSerializer, и применения XmlIgnoreAttribute к полю. Шаблон создается в виде propertyNameSpecified. Например, если есть поле с именем MyFirstName, вы также создадите поле с именем MyFirstNameSpecified, которое указывает XmlSerializer , следует ли создать XML-элемент с именем MyFirstName. Это показано в следующем примере.
Public Class OptionalOrder
' This field's value should not be serialized
' if it is uninitialized.
Public FirstOrder As String
' Use the XmlIgnoreAttribute to ignore the
' special field named "FirstOrderSpecified".
<System.Xml.Serialization.XmlIgnoreAttribute> _
Public FirstOrderSpecified As Boolean
End Class
public class OptionalOrder
{
// This field should not be serialized
// if it is uninitialized.
public string FirstOrder;
// Use the XmlIgnoreAttribute to ignore the
// special field named "FirstOrderSpecified".
[System.Xml.Serialization.XmlIgnoreAttribute]
public bool FirstOrderSpecified;
}
Переопределение сериализации по умолчанию
Можно также переопределить сериализацию любого набора объектов и их полей и свойств, создав один из соответствующих атрибутов и добавив его в экземпляр XmlAttributes класса. Переопределение сериализации таким образом использует два варианта: сначала можно управлять сериализацией объектов, найденных в библиотеке DLL, даже если у вас нет доступа к источнику; во-вторых, можно создать один набор сериализуемых классов, но сериализовать объекты несколькими способами. Дополнительные сведения см. в XmlAttributeOverrides классе и разделе 'Как: Управление сериализацией производных классов.
Чтобы сериализовать объект, вызовите Serialize метод. Чтобы десериализировать объект, вызовите Deserialize метод.
Сведения о добавлении пространств имен XML в XML-документ см. в статье XmlSerializerNamespaces.
Замечание
XmlSerializer оказывает особое внимание классам, реализующим IEnumerable или ICollection. Класс, реализующий IEnumerable , должен реализовать открытый Add метод, который принимает один параметр. Параметр Add метода должен иметь тот же тип, что и свойство, возвращаемое из Current значения, возвращаемого из GetEnumerator, или быть одной из баз этого типа. Класс, реализующий ICollection (например, CollectionBase), в дополнение к IEnumerable, должен иметь общедоступное Item индексированное свойство (индексатор в C#), которое принимает целое число, и общедоступное Count свойство целочисленного типа. Параметр метода Add должен быть такого же типа, как возвращаемый из свойства Item, или одним из базовых типов этого типа. Для классов, реализующих ICollection, сериализуемые значения извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.
Для десериализации объекта необходимо иметь разрешение на запись во временный каталог (как определено переменной среды TEMP).
Динамически генерируемые сборки
Чтобы повысить производительность, инфраструктура сериализации XML динамически создает сборки для сериализации и десериализации указанных типов. Инфраструктура находит и повторно использует эти сборки. Это поведение происходит только при использовании следующих конструкторов:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
При использовании любого из других конструкторов несколько версий одной сборки создаются и никогда не выгружаются, что приводит к утечке памяти и низкой производительности. Самым простым решением является использование одного из ранее упомянутых двух конструкторов. В противном случае необходимо кэшировать сборки в виде Hashtable, как показано в следующем примере.
Hashtable serializers = new Hashtable();
// Use the constructor that takes a type and XmlRootAttribute.
XmlSerializer s = new XmlSerializer(typeof(MyClass), myRoot);
// Implement a method named GenerateKey that creates unique keys
// for each instance of the XmlSerializer. The code should take
// into account all parameters passed to the XmlSerializer
// constructor.
object key = GenerateKey(typeof(MyClass), myRoot);
// Check the local cache for a matching serializer.
XmlSerializer ser = (XmlSerializer)serializers[key];
if (ser == null)
{
ser = new XmlSerializer(typeof(MyClass), myRoot);
// Cache the serializer.
serializers[key] = ser;
}
// Use the serializer to serialize or deserialize.
Dim serializers As New Hashtable()
' Use the constructor that takes a type and XmlRootAttribute.
Dim s As New XmlSerializer(GetType([MyClass]), myRoot)
' Implement a method named GenerateKey that creates unique keys
' for each instance of the XmlSerializer. The code should take
' into account all parameters passed to the XmlSerializer
' constructor.
Dim key As Object = GenerateKey(GetType([MyClass]), myRoot)
' Check the local cache for a matching serializer.
Dim ser As XmlSerializer = CType(serializers(key), XmlSerializer)
If ser Is Nothing Then
ser = New XmlSerializer(GetType([MyClass]), myRoot)
' Cache the serializer.
serializers(key) = ser
End If
' Use the serializer to serialize or deserialize.
Сериализация ArrayList и обобщённого списка
Невозможно сериализовать или десериализовать следующее: XmlSerializer
Сериализация перечислений без знака Long
XmlSerializer Невозможно создать экземпляр для сериализации перечисления, если указаны следующие условия: перечисление имеет тип unsigned long (ulong в C#) и перечисление содержит любой элемент со значением, превышающим 9 223 372 036 854 775 807. Например, не удается сериализовать следующее.
public enum LargeNumbers: ulong
{
a = 9223372036854775808
}
// At runtime, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));
Устаревшие типы
Класс XmlSerializer не сериализует объекты, помеченные как [Obsolete].