Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Атрибуты можно использовать для управления сериализацией XML объекта или создания альтернативного XML-потока из одного набора классов. Дополнительные сведения о создании альтернативного XML-потока см. в разделе "Практическое руководство. Указание альтернативного имени элемента для XML-потока".
Замечание
Если созданный XML-код должен соответствовать разделу 5 документа Консорциума W3C (W3C) с названием Simple Object Access Protocol (SOAP) 1.1, используйте атрибуты, перечисленные в атрибутах, которые управляют сериализацией SOAP в кодировке SOAP.
По умолчанию имя XML-элемента определяется именем класса или члена. В классе с именем Book поле с именем ISBN создаст тег элемента XML <ISBN>, как показано в следующем примере:
Public Class Book
Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might
' produce this XML:
' <ISBN>1234567890</ISBN>.
public class Book
{
public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.
Поведение по умолчанию может быть изменено, если вы хотите присвоить элементу новое имя. В следующем коде показано, как атрибут включает эту функцию, задав ElementName свойство объекта XmlElementAttribute:
Public Class TaxRates
< XmlElement(ElementName = "TaxRate")> _
Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
}
Дополнительные сведения об атрибутах см. в разделе "Атрибуты". Список атрибутов, управляющих сериализацией XML, см. в разделе "Атрибуты, управляющие сериализацией XML".
Управление сериализацией массива
Атрибуты XmlArrayAttribute и XmlArrayItemAttribute управляют сериализацией массивов. С помощью этих атрибутов вы можете управлять именем элемента, пространством имен и типом данных СХЕМЫ XML (XSD), как определено в документе W3C под названием XML Schema Part 2: Datatypes. Можно также указать типы, которые можно включить в массив.
Определяет XmlArrayAttribute свойства заключающего XML-элемента, который получается при сериализации массива. Например, по умолчанию сериализация массива ниже приведет к xml-элементу с именем Employees. Элемент Employees будет содержать ряд элементов с именем типа Employeeмассива.
Public Class Group
Public Employees() As Employee
End Class
Public Class Employee
Public Name As String
End Class
public class Group {
public Employee[] Employees;
}
public class Employee {
public string Name;
}
Сериализованный экземпляр может выглядеть следующим образом:
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
</Employees>
</Group>
Применив XmlArrayAttributeэлемент XML, можно изменить имя XML-элемента следующим образом:
Public Class Group
<XmlArray("TeamMembers")> _
Public Employees() As Employee
End Class
public class Group {
[XmlArray("TeamMembers")]
public Employee[] Employees;
}
Результирующий XML-код может выглядеть следующим образом:
<Group>
<TeamMembers>
<Employee>
<Name>Haley</Name>
</Employee>
</TeamMembers>
</Group>
С другой стороны, XmlArrayItemAttribute управляет тем, как сериализуются элементы, содержащиеся в массиве.
Замечание
Атрибут применяется к полю, возвращающему массив.
Public Class Group
<XmlArrayItem("MemberName")> _
Public Employee() As Employees
End Class
public class Group {
[XmlArrayItem("MemberName")]
public Employee[] Employees;
}
Результирующий XML-код может выглядеть следующим образом:
<Group>
<Employees>
<MemberName>Haley</MemberName>
</Employees>
</Group>
Сериализация производных классов
Другое XmlArrayItemAttribute использование заключается в том, чтобы разрешить сериализацию производных классов. К примеру, можно добавить класс с именем Manager, который является производным от Employee, к предыдущему примеру. Если не применить XmlArrayItemAttribute, код будет давать сбой во время выполнения, поскольку производный тип класса не будет распознан. Чтобы устранить этот результат, примените атрибут дважды, каждый раз задав Type свойство для каждого допустимого типа (базовый и производный).
Public Class Group
<XmlArrayItem(Type:=GetType(Employee)), _
XmlArrayItem(Type:=GetType(Manager))> _
Public Employees() As Employee
End Class
Public Class Employee
Public Name As String
End Class
Public Class Manager
Inherits Employee
Public Level As Integer
End Class
public class Group {
[XmlArrayItem(Type = typeof(Employee)),
XmlArrayItem(Type = typeof(Manager))]
public Employee[] Employees;
}
public class Employee {
public string Name;
}
public class Manager:Employee {
public int Level;
}
Сериализованный экземпляр может выглядеть следующим образом:
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
<Employee xsi:type = "Manager">
<Name>Ann</Name>
<Level>3</Level>
</Employee>
</Employees>
</Group>
Сериализация массива в виде последовательности элементов
Можно также сериализовать массив как неструктурированную последовательность XML-элементов, применив XmlElementAttribute к полю возвращающее массив следующим образом:
Public Class Group
<XmlElement> _
Public Employees() As Employee
End Class
public class Group {
[XmlElement]
public Employee[] Employees;
}
Сериализованный экземпляр может выглядеть следующим образом:
<Group>
<Employees>
<Name>Haley</Name>
</Employees>
<Employees>
<Name>Noriko</Name>
</Employees>
<Employees>
<Name>Marco</Name>
</Employees>
</Group>
Другим способом отличия двух потоков XML является использование средства определения схемы XML для создания файлов документов СХЕМЫ XML (XSD) из скомпилированного кода. Дополнительные сведения об использовании средства см. в статье "Средство определения схемы XML" и сериализация XML. Если атрибут не применяется к полю, схема описывает элемент следующим образом:
<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />
XmlElementAttribute При применении к полю результирующая схема описывает элемент следующим образом:
<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
Сериализация массива
Класс ArrayList может содержать коллекцию различных объектов. Таким образом, вы можете использовать ArrayList так же, как и массив. Вместо создания поля, возвращающего массив типизированных объектов, можно создать поле, которое возвращает один объект ArrayList. Однако, как и в массивах, необходимо сообщить XmlSerializer о типах содержащихся объектов ArrayList . Для этого назначьте несколько экземпляров XmlElementAttribute поля, как показано в следующем примере.
Public Class Group
<XmlElement(Type:=GetType(Employee)), _
XmlElement(Type:=GetType(Manager))> _
Public Info As ArrayList
End Class
public class Group {
[XmlElement(Type = typeof(Employee)),
XmlElement(Type = typeof(Manager))]
public ArrayList Info;
}
Управление сериализацией классов с помощью XmlRootAttribute и XmlTypeAttribute
Можно применить два атрибута только к классу: XmlRootAttribute и XmlTypeAttribute. Эти атрибуты похожи. Его XmlRootAttribute можно применить только к одному классу: класс, который при сериализации представляет открытый и закрывающий элемент XML-документа, другими словами, корневой элемент. С XmlTypeAttributeдругой стороны, можно применить к любому классу, включая корневой класс.
Например, в предыдущих примерах Group класс является корневым классом, а все его открытые поля и свойства становятся XML-элементами, найденными в XML-документе. Таким образом, у вас может быть только один корневой класс. Применив XmlRootAttribute, можно управлять потоком XML, созданным с помощью XmlSerializer. Например, можно изменить имя элемента и пространство имен.
Элемент XmlTypeAttribute позволяет управлять схемой создаваемого XML. Эта возможность полезна, если необходимо опубликовать схему через веб-службу XML. В следующем примере XmlTypeAttribute и XmlRootAttribute применяются к одному и тому же классу:
<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
public Employee[] Employees;
}
Если этот класс компилируется, а средство определения схемы XML используется для создания схемы, вы найдете следующее описание XML Group:
<xs:element name="NewGroupName" type="NewTypeName" />
В отличие от этого, если бы вы сериализовали экземпляр класса, в XML-документе будет найдено только NewGroupName.
<NewGroupName>
. . .
</NewGroupName>
Предотвращение сериализации с помощью XmlIgnoreAttribute
Вы можете столкнуться с ситуацией, когда общедоступное свойство или поле не нужно сериализовать. Например, поле или свойство можно использовать для хранения метаданных. В таких случаях примените XmlIgnoreAttribute к полю или свойству, и XmlSerializer пропустит его.
См. также
- Атрибуты, управляющие сериализацией XML
- Атрибуты, управляющие кодированной сериализацией SOAP
- Введение в сериализацию XML
- Примеры сериализации XML
- Практическое руководство. Указание альтернативного имени элемента для XML-потока
- Практическое руководство. Сериализация объекта
- Практическое руководство. Десериализация объекта