Udostępnij za pomocą


Kontrolowanie serializacji XML przy użyciu atrybutów

Atrybuty mogą służyć do kontrolowania serializacji XML obiektu lub tworzenia alternatywnego strumienia XML z tego samego zestawu klas. Aby uzyskać więcej informacji na temat tworzenia alternatywnego strumienia XML, zobacz How to: Specify an Alternate Element Name for an XML Stream (Instrukcje: określanie alternatywnej nazwy elementu dla strumienia XML).

Uwaga / Notatka

Jeśli wygenerowany XML musi być zgodny z sekcją 5 dokumentu World Wide Web Consortium (W3C) zatytułowanego Simple Object Access Protocol (SOAP) 1.1, użyj atrybutów wymienionych w sekcji Atrybuty kontrolujące kodowaną serializację SOAP.

Domyślnie nazwa elementu XML jest określana przez nazwę klasy lub składowej. W klasie o nazwie Book, pole o nazwie ISBN spowoduje wygenerowanie tagu elementu XML <ISBN>, jak widać w poniższym przykładzie:

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>.

Domyślne zachowanie można zmienić, jeśli chcesz nadać elementowi nową nazwę. Poniższy kod pokazuje, jak atrybut włącza tę funkcję, ustawiając ElementName właściwość elementu XmlElementAttribute:

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

Aby uzyskać więcej informacji na temat atrybutów, zobacz Atrybuty. Aby uzyskać listę atrybutów kontrolujących serializacji XML, zobacz Atrybuty kontrolujące serializacji XML.

Kontrolowanie serializacji tablicy

Atrybuty XmlArrayAttribute i XmlArrayItemAttribute kontrolują serializację tablic. Korzystając z tych atrybutów, można kontrolować nazwę elementu, przestrzeń nazw i typ danych schematu XML (XSD) zgodnie z definicją w dokumencie W3C zatytułowanym Schemat XML Część 2: Typy danych. Można również określić typy, które można uwzględnić w tablicy.

XmlArrayAttribute określi właściwości obejmującego elementu XML, które powstaje podczas serializacji tablicy. Na przykład domyślnie serializowanie poniższej tablicy spowoduje powstanie elementu XML o nazwie Employees. Element Employees będzie zawierać serię elementów nazwanych na podstawie typu tablicy 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;
}

Serializowane wystąpienie może przypominać następujący kod:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees>
</Group>

Stosując element XmlArrayAttribute, można zmienić nazwę elementu XML w następujący sposób:

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

Wynikowy kod XML może przypominać następujący kod:

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>
</Group>

Z drugiej strony element XmlArrayItemAttributeokreśla sposób serializacji elementów znajdujących się w tablicy.

Uwaga / Notatka

Atrybut jest stosowany do pola zwracającego tablicę.

Public Class Group
    <XmlArrayItem("MemberName")> _
    Public Employee() As Employees
End Class
public class Group {
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

Wynikowy kod XML może przypominać następujący kod:

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

Serializowanie klas pochodnych

Innym zastosowaniem elementu XmlArrayItemAttribute jest umożliwienie serializacji klas pochodnych. Na przykład do poprzedniego przykładu można dodać inną klasę o nazwie Manager , która pochodzi z Employee klasy . Jeśli nie zastosujesz XmlArrayItemAttribute, kod zawiedzie w czasie wykonywania, ponieważ ten typ klasy pochodnej nie zostanie rozpoznany. Aby rozwiązać ten wynik, zastosuj atrybut dwa razy, za każdym razem ustawiając Type właściwość dla każdego dopuszczalnego typu (podstawowego i pochodnego).

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;
}

Serializowane wystąpienie może przypominać następujący kod:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    </Employee>
</Employees>
</Group>

Serializowanie tablicy jako sekwencji elementów

Można również serializować tablicę jako płaską sekwencję elementów XML, stosując XmlElementAttribute do pola, które zwraca tablicę, w następujący sposób:

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlElement]
    public Employee[] Employees;
}

Serializowane wystąpienie może przypominać następujący kod:

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

Innym sposobem odróżnienia dwóch strumieni XML jest użycie narzędzia definicji schematu XML do generowania plików dokumentów schematu XML (XSD) na podstawie skompilowanego kodu. Aby uzyskać więcej informacji na temat korzystania z narzędzia, zobacz Narzędzie definicji schematu XML i serializacja XML. Jeśli do pola nie zastosowano żadnego atrybutu, schemat opisuje element w następujący sposób:

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

Po zastosowaniu komponentu XmlElementAttribute do pola, wynikowy schemat opisuje element w następujący sposób:

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />

Serializowanie ArrayList

Klasa ArrayList może zawierać kolekcję różnych obiektów. Można zatem używać ArrayList podobnie jak tablicy. Zamiast tworzyć pole zwracające tablicę wpisanych obiektów, można jednak utworzyć pole zwracające pojedynczy ArrayListobiekt . Jednak podobnie jak w przypadku tablic, należy poinformować XmlSerializer o typach ArrayList obiektów, które zawiera. Aby to osiągnąć, przypisz wiele wystąpień XmlElementAttribute obiektu do pola, jak pokazano w poniższym przykładzie.

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;
}

Kontrolowanie serializacji klas przy użyciu xmlRootAttribute i XmlTypeAttribute

Do klasy można zastosować tylko dwa atrybuty: XmlRootAttribute i XmlTypeAttribute. Te atrybuty są podobne. Można XmlRootAttribute go zastosować tylko do jednej klasy: klasy, która po serializacji reprezentuje element otwierający i zamykający dokumentu XML — innymi słowy, element główny. Po drugiej stronie, XmlTypeAttribute można zastosować do dowolnej klasy, w tym klasy głównej.

Na przykład w poprzednich przykładach Group klasa jest klasą główną, a wszystkie jej pola publiczne i właściwości stają się elementami XML znajdującymi się w dokumencie XML. W związku z tym można mieć tylko jedną klasę główną. Stosując element XmlRootAttribute, można kontrolować strumień XML wygenerowany przez element XmlSerializer. Można na przykład zmienić nazwę elementu i przestrzeń nazw.

Element XmlTypeAttribute umożliwia kontrolowanie schematu wygenerowanego kodu XML. Ta funkcja jest przydatna w przypadku konieczności opublikowania schematu za pośrednictwem usługi sieci Web XML. Poniższy przykład stosuje zarówno XmlTypeAttribute, jak i XmlRootAttribute do tej samej klasy.

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
    public Employee[] Employees;
}

Jeśli ta klasa jest kompilowana, a narzędzie definicji schematu XML jest używane do generowania jego schematu, można znaleźć następujący kod XML opisujący Group:

<xs:element name="NewGroupName" type="NewTypeName" />

Natomiast w przypadku serializacji wystąpienia klasy można znaleźć tylko NewGroupName w dokumencie XML:

<NewGroupName>
    . . .
</NewGroupName>

Zapobieganie serializacji za pomocą atrybutu XmlIgnoreAttribute

Możesz napotkać sytuację, w której właściwość publiczna lub pole nie musi być serializowane. Na przykład można użyć pola lub właściwości do przechowywania metadanych. W takich przypadkach zastosuj element XmlIgnoreAttribute na pole lub właściwość, a element XmlSerializer je pominie.

Zobacz także