Freigeben über


Steuern der XML-Serialisierung mit Attributen

Attribute können verwendet werden, um die XML-Serialisierung eines Objekts zu steuern oder um einen alternativen XML-Stream aus derselben Reihe von Klassen zu erstellen. Weitere Informationen zum Erstellen eines alternativen XML-Streams finden Sie unter Überschreiben der XML-Serialisierung.

Hinweis   Wenn der generierte XML-Stream Abschnitt 5 des vom World Wide Web Consortium (www.w3.org) herausgegebenen Dokuments mit dem Titel "Simple Object Access Protocol (SOAP) 1.1" (nur auf Englisch verfügbar) entsprechen muss, verwenden Sie die unter Attribute für die Steuerung der Serialisierung von codiertem SOAP aufgeführten Attribute.

Standardmäßig ist der Name eines XML-Elements durch den Klassen- oder Membernamen festgelegt. In einer einfachen Klasse mit der Bezeichnung Book wird durch ein Feld mit der Bezeichnung ISBN ein XML-Elementtag <ISBN> erstellt, wie in folgendem Beispiel gezeigt.

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>.
[C#]
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might 
// produce this XML:
// <ISBN>1234567890</ISBN>.

Dieses Standardverhalten können Sie ändern, falls Sie das Element umbenennen möchten. Wie ein Attribut dies über das Festlegen der ElementName-Eigenschaft eines XmlElementAttribute ermöglicht, veranschaulicht folgender Code.

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

Weitere Informationen zu Attributen finden Sie unter Erweitern von Metadaten mit Hilfe von Attributen. Eine Liste mit Attributen zum Steuern der XML-Serialisierung finden Sie unter Attribute für die Steuerung der Serialisierung.

So steuern Sie die Serialisierung mit Attributen

  1. Wenden Sie eines der speziellen Attribute auf die Klasse oder den Klassenmember an. Eine Liste der Attribute zum Steuern der Serialisierung finden Sie unter Attribute für die Steuerung der Serialisierung.
  2. Ändern Sie ggf. den Member der Klasse. Benennen Sie zum Beispiel den Namen eines Members um, aber legen Sie die ElementName-Eigenschaft auf einen geeigneten Wert fest, also auf einen Wert, der dem XSD-Schema des serialisierten Objekts entspricht.
  3. Serialisieren oder deserialisieren Sie die Klasseninstanz.

Der resultierende XML-Stream wird mit dem Schema übereinstimmen, aber die Klasse wird einen lesbaren Methodennamen haben.

Steuern der Serialsierung von Arrays

Das XmlArrayAttribute-Attribut und das XmlArrayItemAttribute-Attribut sind auf die Steuerung der Serialisierung von Arrays ausgelegt. Mit diesen Attributen können Sie Elementname, Namespace und XML-Schema-(XSD-)Datentyp steuern (wie im vom World Wide Web Consortium [www.w3.org] herausgegebenen Dokument mit dem Titel "XML Schema Part 2: Datatypes" [nur auf Englisch verfügbar] festgelegt). Sie können auch die Typen angeben, die in einem Array enthalten sein können.

Durch XmlArrayAttribute werden die Eigenschaften des einschließenden XML-Elements bestimmt, das aus der Serialisierung eines Arrays hervorgeht. So wird beispielsweise durch Serialisieren des unten aufgeführten Arrays ein XML-Element mit der Bezeichnung Employees gebildet. Das Employees-Element enthält eine Reihe von Elementen, die nach dem Arraytyp Employee benannt sind.

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String;
End Class
[C#]
public class Group{
    public Employee[] Employees;
}
public class Employee{
    public string Name;
}

Eine serialisierte Instanz könnte mit folgendem Beispiel vergleichbar sein.

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

Durch Anwenden eines XmlArrayAttribute können Sie den Namen des XML-Elements wie folgt ändern.

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

Der resultierende XML-Stream könnte mit folgendem Beispiel vergleichbar sein.

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

Andererseits wird durch XmlArrayItemAttribute gesteuert, wie die im Array enthaltenen Elemente serialisiert werden. Beachten Sie, dass das Attribut im folgenden Beispiel auf das Feld angewendet wird, das das Array zurückgibt.

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

Der resultierende XML-Stream könnte mit folgendem Beispiel vergleichbar sein.

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

Serialisieren von abgeleiteten Klassen

Eine weitere Verwendung von XmlArrayItemAttribute ist das Ermöglichen der Serialisierung abgeleiteter Klassen. Zum Beispiel kann eine weitere Klasse mit der Bezeichnung Manager, die von Employee abgeleitet wird, dem vorangegangenen Beispiel hinzugefügt werden. Wenn Sie XmlArrayItemAttribute nicht anwenden, schlägt der Code zur Laufzeit fehl, da der abgeleitete Klassentyp nicht erkannt wird. Um dieses Problem zu beheben, wenden Sie das Attribut zweimal an, und legen Sie jedesmal die XmlArrayItemAttribute.Type-Eigenschaft für jeden zulässigen Typ fest (Basisklasse und abgeleitete Klasse).

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
[C#]
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;
}

Eine serialisierte Instanz könnte mit folgendem Beispiel vergleichbar sein.

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

Serialisieren eines Arrays als Abfolge von Elementen

Sie können ein Array auch als eine "flache" Sequenz von XML-Elementen serialisieren, indem Sie ein XmlElementAttribute auf das Feld anwenden, das das Array wie folgt zurückgibt.

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

Eine serialisierte Instanz könnte mit folgendem Beispiel vergleichbar sein.

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

Eine weitere Möglichkeit, die zwei XML-Streams zu unterscheiden, ist die Verwendung des XML Schema Definition-Tools zur Generierung des XSD-Dokuments (XML Schema) aus dem kompilierten Code. (Weitere Einzelheiten zur Verwendung dieses Tools finden Sie unter Das XML Schema Definition-Tool und XML-Serialisierung.) Werden keine Attribute auf das Feld angewendet, wird das Element durch das Schema auf folgende Weise beschrieben.

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

Wird XmlElementAttribute auf das Feld angewendet, wird das Element durch das resultierende Schema auf folgende Weise beschrieben.

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

Serialisieren einer ArrayList-Klasse

Die ArrayList-Klasse stellt eine Auflistung bereit, die verschiedene Objekte enthalten kann. Daher können Sie eine ArrayList-Klasse wie ein Array verwenden. Statt ein Feld zu erstellen, das ein Array von Objekten mit Typbindung zurückgibt, können Sie auch ein Feld erstellen, das eine einzelne ArrayList-Klasse zurückgibt. Wie es auch bei Arrays der Fall ist, müssen Sie die XmlSerializer-Klasse über die Typen der in der ArrayList-Klasse enthaltenen Objekte informieren. Dazu müssen Sie dem Feld mehrere Instanzen des XmlElementAttribute zuordnen, wie in folgendem Beispiel gezeigt.

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
[C#]
public class Group{
    [XmlElement(Type = typeof(Employee)), 
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

Steuern der Serialisierung von Klassen mit dem XmlRootAttribute-Attribut und dem XmlTypeAttribute-Attribut

Auf eine Klasse (und nur auf eine Klasse) können zwei Attribute angewendet werden: XmlRootAttribute und XmlTypeAttribute. Diese sind sich sehr ähnlich. XmlRootAttribute kann nur auf eine Klasse angewendet werden, und zwar auf die Klasse, die das öffnende und schließende Element des XML-Dokuments darstellt, nachdem sie serialisiert wurde, mit anderen Worten das "Stammelement". Dagegen kann XmlTypeAttribute auf beliebige Klassen einschließlich der Stammklasse angewendet werden.

So ist beispielsweise im vorangegangen Beispiel die Group-Klasse die Stammklasse, und ihre gesamten öffentlichen Felder und Eigenschaften werden zu den im XML-Dokument gefundenen XML-Elementen. Daher kann es nur eine Stammklasse geben. Durch Anwendung von XmlRootAttribute können Sie den durch XmlSerializer generierten XML-Stream steuern. So können Sie Elementname und Namespace ändern.

XmlTypeAttribute ermöglicht Ihnen die Steuerung des Schemas des generierten XML-Streams. Diese Funktion ist hilfreich, wenn Sie das Schema über einen XML-Webdienst veröffentlichen. In folgendem Beispiel werden das XmlTypeAttribute-Attribut und das XmlRootAttribute-Attribut auf dieselbe Klasse angewendet.

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

Wenn diese Klasse kompiliert ist, und ihr Schema mit Hilfe des XML Schema Definition-Tools generiert wurde, erhalten Sie als Beschreibung von Group folgenden XML-Stream.

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

Wenn Sie dagegen eine Instanz der Klasse serialisieren würden, enthält das XML-Dokument lediglich NewGroupName.

<NewGroupName>
    . . .
</NewGroupName>

Verhindern der Serialisierung mit XmlIgnoreAttribute

Es kann vorkommen, dass eine öffentliche Eigenschaft oder ein öffentliches Feld nicht serialisiert werden muss. Beispielsweise könnte ein Feld oder eine Eigenschaft verwendet werden, damit es Metadaten enthält. Wenden Sie in diesen Fällen XmlIgnoreAttribute auf das Feld oder die Eigenschaft an, damit XmlSerializer das Feld oder die Eigenschaft überspringt.

Siehe auch

Attribute für die Steuerung der XML-Serialisierung | Attribute für die Steuerung der Serialisierung von codiertem SOAP | Einführung in die XML-Serialisierung | Beispiele für die XML-Serialisierung | Überschreiben der XML-Serialisierung