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.
Mit Hilfe von XmlSerializer können Sie mit derselben Reihe von Klassen mehrere XML-Streams generieren. Das könnte z. B. sinnvoll sein, wenn für zwei verschiedene XML-Webdienste dieselben grundlegenden Informationen mit nur geringen Unterschieden erforderlich sind. Angenommen, zwei XML-Webdienste verarbeiten Buchbestellungen, wofür beide die ISBN benötigen. Ein Dienst verwendet das Tag <ISBN> und der zweite <BookID>. Sie haben eine Klasse mit der Bezeichnung Book, die ein Feld mit der Bezeichnung ISBN enthält. Wird eine Instanz der Book-Klasse serialisiert, verwendet sie standardmäßig den Membernamen (ISBN) als Elementnamen für das Tag. Im Falle des ersten XML-Webdienstes ist dies das erwartete Verhalten. Um allerdings den XML-Stream an den zweiten XML-Webdienst zu senden, müssen Sie die Serialisierung überschreiben, so dass der Elementname des Tags BookID lautet.
So erstellen Sie einen XML-Stream mit einem alternativen Elementnamen
- Erstellen Sie eine Instanz der XmlElementAttribute-Klasse.
- Legen Sie ElementName von XmlElementAttribute auf "BookID" fest.
- Erstellen Sie eine Instanz der XmlAttributes-Klasse.
- Fügen Sie das XmlElementAttribute-Objekt der Auflistung hinzu, auf die über die XmlElements-Eigenschaft von XmlAttributes zugegriffen wird.
- Erstellen Sie eine Instanz der XmlAttributeOverrides-Klasse.
- Fügen Sie XmlAttributes zu XmlAttributeOverrides hinzu, wobei der Typ des zu überschreibenden Objekts und der Name des überschriebenen Members übergeben werden.
- Erstellen Sie eine Instanz der XmlSerializer-Klasse mit XmlAttributeOverrides.
- Erstellen Sie eine Instanz der
Book-Klasse, und serialisieren oder deserialisieren Sie diese.
Dieser Serialisierungsprozess wird im folgenden Beispiel dargestellt.
Public Class SerializeOverride()
' Creates an XmlElementAttribute with the alternate name.
Dim myElementAttribute As XmlElementAttribute = _
New XmlElementAttribute()
myElementAttribute.ElementName = "BookID"
Dim myAttributes As XmlAttributes = New XmlAttributes()
myAttributes.XmlElements.Add(myElementAttribute)
Dim myOverrides As XmlAttributeOverrides = New XmlAttributeOverrides()
myOverrides.Add(typeof(Book), "ISBN", myAttributes)
Dim mySerializer As XmlSerializer = _
New XmlSerializer(GetType(Book), myOverrides)
Dim b As Book = New Book()
b.ISBN = "123456789"
' Creates a StreamWriter to write the XML stream to.
Dim writer As StreamWriter = New StreamWriter("Book.xml")
mySerializer.Serialize(writer, b);
End Class
[C#]
public class SerializeOverride()
{
// Creates an XmlElementAttribute with the alternate name.
XmlElementAttribute myElementAttribute = new XmlElementAttribute();
myElementAttribute.ElementName = "BookID";
XmlAttributes myAttributes = new XmlAttributes();
myAttributes.XmlElements.Add(myElementAttribute);
XmlAttributeOverrides myOverrides = new XmlAttributeOverrides();
myOverrides.Add(typeof(Book), "ISBN", myAttributes);
XmlSerializer mySerializer =
new XmlSerializer(typeof(Book), myOverrides)
Book b = new Book();
b.ISBN = "123456789"
// Creates a StreamWriter to write the XML stream to.
StreamWriter writer = new StreamWriter("Book.xml");
mySerializer.Serialize(writer, b);
}
Der XML-Stream könnte mit folgendem Beispiel vergleichbar sein.
<Book>
<BookID>123456789</BookID>
</Book>
Überschreiben von Klassen
Sie haben die Möglichkeit, einen alternativen XML-Stream durch Ableitung von vorhandenen Klassen und Anweisung der XmlSerializer-Klasse zur Serialisierung dieser Klassen zu erstellen. Im Falle der oben genannten Book-Klasse können Sie beispielsweise von dieser Klasse ableiten und eine ExpandedBook-Klasse erstellen, die über einige zusätzliche Eigenschaften verfügt. Allerdings müssen Sie die XmlSerializer-Klasse anweisen, den abgeleiteten Typ beim Serialisieren oder Deserialisieren zu akzeptieren. Das kann erreicht werden, indem Sie ein XmlElementAttribute-Objekt erstellen und dessen Type-Eigenschaft auf den Typ der abgeleiteten Klasse festlegen. Fügen Sie das XmlElementAttribute zu XmlAttributes hinzu. Fügen Sie dann einem XmlAttributeOverrides-Objekt das XmlAttributes hinzu, wobei der Typ, der überschrieben wird, und der Name des Members, der die abgeleitete Klasse akzeptiert, festgelegt wird. Dies wird im folgenden Beispiel gezeigt.
Public Class Orders
public Books() As Book
End Class
Public Class Book
public ISBN As String
End Class
Public Class ExpandedBook
Inherits Book
public NewEdition As Boolean
End Class
Public Class Run
Shared Sub Main()
Dim t As Run = New Run()
t.SerializeObject("Book.xml")
t.DeserializeObject("Book.xml")
End Sub
Public Sub SerializeObject(filename As String)
' Each overridden field, property, or type requires
' an XmlAttributes.
Dim attrs As XmlAttributes = New XmlAttributes()
' Creates an XmlElementAttribute to override the
' field that returns Book objects. The overridden field
' returns Expanded objects instead.
Dim attr As XmlElementAttribute = _
New XmlElementAttribute()
attr.ElementName = "NewBook"
attr.Type = GetType(ExpandedBook)
' Adds the element to the collection of elements.
attrs.XmlElements.Add(attr)
' Creates the XmlAttributeOverrides.
Dim attrOverrides As XmlAttributeOverrides = _
New XmlAttributeOverrides()
' Adds the type of the class that contains the overridden
' member, and the XmlAttributes to override it with, to the
' XmlAttributeOverrides.
attrOverrides.Add(GetType(Orders), "Books", attrs)
' Creates the XmlSerializer using the XmlAttributeOverrides.
Dim s As XmlSerializer = _
New XmlSerializer(GetType(Orders), attrOverrides)
' Writing the file requires a TextWriter.
Dim writer As TextWriter = New StreamWriter(filename)
' Creates the object that will be serialized.
Dim myOrders As Orders = New Orders()
' Creates an object of the derived type.
Dim b As ExpandedBook = New ExpandedBook()
b.ISBN= "123456789"
b.NewEdition = True
myOrders.Books = New ExpandedBook(){b}
' Serializes the object.
s.Serialize(writer,myOrders)
writer.Close()
End Sub
Public Sub DeserializeObject(filename As String)
Dim attrOverrides As XmlAttributeOverrides = _
New XmlAttributeOverrides()
Dim attrs As XmlAttributes = New XmlAttributes()
' Creates an XmlElementAttribute to override the
' field that returns Book objects. The overridden field
' returns Expanded objects instead.
Dim attr As XmlElementAttribute = _
New XmlElementAttribute()
attr.ElementName = "NewBook"
attr.Type = GetType(ExpandedBook)
' Adds the XmlElementAttribute to the collection of objects.
attrs.XmlElements.Add(attr)
attrOverrides.Add(GetType(Orders), "Books", attrs)
' Creates the XmlSerializer using the XmlAttributeOverrides.
Dim s As XmlSerializer = _
New XmlSerializer(GetType(Orders), attrOverrides)
Dim fs As FileStream = New FileStream(filename, FileMode.Open)
Dim myOrders As Orders = CType( s.Deserialize(fs), Orders)
Console.WriteLine("ExpandedBook:")
' The difference between deserializing the overridden
' XML document and serializing it is this: To read the derived
' object values, you must declare an object of the derived type
' and cast the returned object to it.
Dim expanded As ExpandedBook
Dim b As Book
for each b in myOrders.Books
expanded = CType(b, ExpandedBook)
Console.WriteLine(expanded.ISBN)
Console.WriteLine(expanded.NewEdition)
Next
End Sub
End Class
[C#]
public class Orders
{
public Book[] Books;
}
public class Book
{
public string ISBN;
}
public class ExpandedBook:Book
{
public bool NewEdition;
}
public class Run
{
public void SerializeObject(string filename)
{
// Each overridden field, property, or type requires
// an XmlAttributes.
XmlAttributes attrs = new XmlAttributes();
// Creates an XmlElementAttribute to override the
// field that returns Book objects. The overridden field
// returns Expanded objects instead.
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "NewBook";
attr.Type = typeof(ExpandedBook);
// Adds the element to the collection of elements.
attrs.XmlElements.Add(attr);
// Creates the XmlAttributeOverrides.
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
// Adds the type of the class that contains the overridden
// member, and the XmlAttributes to override it with, to the
// XmlAttributeOverrides.
attrOverrides.Add(typeof(Orders), "Books", attrs);
// Creates the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer s =
new XmlSerializer(typeof(Orders), attrOverrides);
// Writing the file requires a TextWriter.
TextWriter writer = new StreamWriter(filename);
// Creates the object that will be serialized.
Orders myOrders = new Orders();
// Creates an object of the derived type.
ExpandedBook b = new ExpandedBook();
b.ISBN= "123456789";
b.NewEdition = true;
myOrders.Books = new ExpandedBook[]{b};
// Serializes the object.
s.Serialize(writer,myOrders);
writer.Close();
}
public void DeserializeObject(string filename)
{
XmlAttributeOverrides attrOverrides =
new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
// Creates an XmlElementAttribute to override the
// field that returns Book objects. The overridden field
// returns Expanded objects instead.
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "NewBook";
attr.Type = typeof(ExpandedBook);
// Adds the XmlElementAttribute to the collection of objects.
attrs.XmlElements.Add(attr);
attrOverrides.Add(typeof(Orders), "Books", attrs);
// Creates the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer s =
new XmlSerializer(typeof(Orders), attrOverrides);
FileStream fs = new FileStream(filename, FileMode.Open);
Orders myOrders = (Orders) s.Deserialize(fs);
Console.WriteLine("ExpandedBook:");
// The difference between deserializing the overridden
// XML document and serializing it is this: To read the derived
// object values, you must declare an object of the derived type
// and cast the returned object to it.
ExpandedBook expanded;
foreach(Book b in myOrders.Books)
{
expanded = (ExpandedBook)b;
Console.WriteLine(
expanded.ISBN + "\n" +
expanded.NewEdition);
}
}
}
Siehe auch
XML- und SOAP-Serialisierung | XmlSerializer | XmlElementAttribute | XmlAttributes | XmlAttributeOverrides