Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Attribute können verwendet werden, um die XML-Serialisierung eines Objekts zu steuern oder einen alternativen XML-Datenstrom aus derselben Gruppe von Klassen zu erstellen. Weitere Informationen zum Erstellen eines alternativen XML-Datenstroms finden Sie unter How to: Specify an Alternate Element Name for an XML Stream.
Hinweis
Wenn der generierte XML-Code Dem Abschnitt 5 des W3C-Dokuments (World Wide Web Consortium) mit dem Titel "Simple Object Access Protocol (SOAP) 1.1" entsprechen muss, verwenden Sie die attribute, die in Attributes That Control Encoded SOAP Serialization aufgeführt sind.
Standardmäßig wird ein XML-Elementname durch den Klassen- oder Membernamen bestimmt. In einer Klasse mit dem Namen Book"ISBN" wird ein XML-Elementtag <ISBN>erzeugt, wie im folgenden 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>.
public class Book
{
public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.
Das Standardverhalten kann geändert werden, wenn Sie dem Element einen neuen Namen geben möchten. Der folgende Code zeigt, wie ein Attribut diese Funktionalität ermöglicht, indem die ElementName-Eigenschaft einer XmlElementAttribute festgelegt wird.
Public Class TaxRates
< XmlElement(ElementName = "TaxRate")> _
Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
}
Weitere Informationen zu Attributen finden Sie unter "Attribute". Eine Liste der Attribute, die die XML-Serialisierung steuern, finden Sie unter Attribute that Control XML Serialization.
Steuerung von Array-Serialisierung
Die Attribute XmlArrayAttribute und XmlArrayItemAttribute steuern die Serialisierung von Arrays. Mithilfe dieser Attribute können Sie den Elementnamen, den Namespace und den XML-Schemadatentyp (XSD) wie im W3C-Dokument mit dem Titel "XML-Schemateil 2: Datentypen" definiert steuern. Sie können auch die Typen angeben, die in ein Array eingeschlossen werden können.
XmlArrayAttribute bestimmt die Eigenschaften des umschließenden XML-Elements, die beim Serialisieren eines Arrays resultieren. Die Serialisierung des folgenden Arrays führt z. B. standardmäßig zu einem XML-Element namens Employees. Das Employees Element enthält eine Reihe von Elementen, die nach dem Arraytyp Employeebenannt sind.
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;
}
Eine serialisierte Instanz könnte dem folgenden Code ähneln:
<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
public class Group {
[XmlArray("TeamMembers")]
public Employee[] Employees;
}
Der resultierende XML-Code kann dem folgenden Code ähneln:
<Group>
<TeamMembers>
<Employee>
<Name>Haley</Name>
</Employee>
</TeamMembers>
</Group>
Auf der anderen Seite XmlArrayItemAttribute wird gesteuert, wie die im Array enthaltenen Elemente serialisiert werden.
Hinweis
Das Attribut wird auf das Feld angewendet, das das Array zurückgibt.
Public Class Group
<XmlArrayItem("MemberName")> _
Public Employee() As Employees
End Class
public class Group {
[XmlArrayItem("MemberName")]
public Employee[] Employees;
}
Der resultierende XML-Code kann dem folgenden Code ähneln:
<Group>
<Employees>
<MemberName>Haley</MemberName>
</Employees>
</Group>
Serialisieren abgeleiteter Klassen
Eine weitere Verwendung besteht XmlArrayItemAttribute darin, die Serialisierung abgeleiteter Klassen zuzulassen. Eine andere Klasse mit dem Namen Manager , von Employee der abgeleitet wird, kann beispielsweise dem vorherigen Beispiel hinzugefügt werden. Wenn Sie den XmlArrayItemAttributeCode nicht anwenden, schlägt der Code zur Laufzeit fehl, da der abgeleitete Klassentyp nicht erkannt wird. Um dieses Ergebnis zu beheben, wenden Sie das Attribut zweimal an, bei jedem Festlegen der Type Eigenschaft für jeden akzeptablen Typ (Basis und abgeleitet).
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;
}
Eine serialisierte Instanz könnte dem folgenden Code ähneln:
<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 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
public class Group {
[XmlElement]
public Employee[] Employees;
}
Eine serialisierte Instanz könnte dem folgenden Code ähneln:
<Group>
<Employees>
<Name>Haley</Name>
</Employees>
<Employees>
<Name>Noriko</Name>
</Employees>
<Employees>
<Name>Marco</Name>
</Employees>
</Group>
Eine weitere Möglichkeit zum Unterscheiden der beiden XML-Datenströme besteht darin, das XML-Schemadefinitionstool zum Generieren der XML-Schemadateien (XSD) aus dem kompilierten Code zu verwenden. Weitere Informationen zur Verwendung des Tools finden Sie im XML-Schemadefinitionstool und der XML-Serialisierung. Wenn kein Attribut auf das Feld angewendet wird, beschreibt das Schema das Element wie folgt:
<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />
Wenn das Feld XmlElementAttribute auf das Feld angewendet wird, beschreibt das daraus resultierende Schema das Element wie folgt:
<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
Serialisieren einer ArrayList
Die ArrayList Klasse kann eine Auflistung verschiedener Objekte enthalten. Sie können daher ein ArrayList ähnlich verwenden wie ein Array. Anstatt ein Feld zu erstellen, das ein Array von typierten Objekten zurückgibt, können Sie jedoch ein Feld erstellen, das eine einzelne ArrayListzurückgibt. Wie bei Arrays müssen Sie jedoch den XmlSerializer darüber informieren, welche Arten von Objekten der ArrayList enthält. Weisen Sie dazu dem Feld mehrere Instanzen XmlElementAttribute zu, wie im folgenden Beispiel gezeigt.
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;
}
Steuern der Serialisierung von Klassen mithilfe von XmlRootAttribute und XmlTypeAttribute
Sie können nur zwei Attribute auf eine Klasse anwenden: XmlRootAttribute und XmlTypeAttribute. Diese Attribute sind ähnlich. Dies XmlRootAttribute kann nur auf eine Klasse angewendet werden: die Klasse, die beim Serialisieren das öffnende und schließende Element des XML-Dokuments darstellt, d. h. das Stammelement. Die XmlTypeAttributewiederum kann auf eine beliebige Klasse angewendet werden, einschließlich der Stammklasse.
In den vorherigen Beispielen ist die Klasse beispielsweise die Group Stammklasse, und alle öffentlichen Felder und Eigenschaften werden zu den XML-Elementen im XML-Dokument. Daher können Sie nur eine Stammklasse haben. Durch die Anwendung von XmlRootAttribute können Sie den XML-Datenstrom steuern, der von XmlSerializer generiert wird. Sie können z. B. den Elementnamen und den Namespace ändern.
Auf XmlTypeAttribute können Sie das Schema der generierten XML steuern. Diese Funktion ist nützlich, wenn Sie das Schema über einen XML-Webdienst veröffentlichen müssen. Das folgende Beispiel wendet sowohl XmlTypeAttribute als auch XmlRootAttribute auf die gleiche Klasse an.
<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
public Employee[] Employees;
}
Wenn diese Klasse kompiliert wird und das XML-Schemadefinitionstool zum Generieren des Schemas verwendet wird, finden Sie die folgende XML-Beschreibung Group:
<xs:element name="NewGroupName" type="NewTypeName" />
Wenn Sie hingegen eine Instanz der Klasse serialisieren möchten, wird nur NewGroupName im XML-Dokument gefunden:
<NewGroupName>
. . .
</NewGroupName>
Verhindern der Serialisierung mit dem XmlIgnoreAttribute
Möglicherweise kommt es zu einer Situation, in der eine öffentliche Eigenschaft oder ein öffentliches Feld nicht serialisiert werden muss. Beispielsweise könnte ein Feld oder eine Eigenschaft verwendet werden, um Metadaten zu enthalten. Wenden Sie in solchen Fällen XmlIgnoreAttribute auf das Feld oder die Eigenschaft an, und XmlSerializer wird sie überspringen.
Siehe auch
- Attribute, die die XML-Serialisierung steuern
- Attribute, die codierte SOAP-Serialisierung steuern
- Einführung in die XML-Serialisierung
- Beispiele für die XML-Serialisierung
- Vorgehensweise: Angeben eines alternativen Elementnamens für einen XML-Stream
- Gewusst wie: Serialisieren eines Objekts
- Vorgehensweise: Deserialisieren eines Objekts