XmlAttributeOverrides Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ermöglicht das Überschreiben der Attribute von Eigenschaften, Feldern und Klassen beim Serialisieren oder Deserialisieren eines Objekts mit XmlSerializer.
public ref class XmlAttributeOverrides
public class XmlAttributeOverrides
type XmlAttributeOverrides = class
Public Class XmlAttributeOverrides
- Vererbung
-
XmlAttributeOverrides
Beispiele
Das folgende Beispiel serialisiert eine Klasse namens , die ein einzelnes Feld Instruments
enthältOrchestra
, das ein Array von Instrument
Objekten zurückgibt. Eine zweite Klasse namens Brass
erbt von der Instrument
Klasse. Im Beispiel wird eine Instanz der XmlAttributeOverrides Klasse verwendet, um das Instrument
Feld außer Kraft zu setzen, sodass das Feld Objekte akzeptiert Brass
.
#using <System.Xml.dll>
#using <System.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml::Serialization;
public ref class Instrument
{
public:
String^ Name;
};
public ref class Brass: public Instrument
{
public:
bool IsValved;
};
public ref class Orchestra
{
public:
array<Instrument^>^Instruments;
};
void SerializeObject( String^ filename )
{
/* Each overridden field, property, or type requires
an XmlAttributes object. */
XmlAttributes^ attrs = gcnew XmlAttributes;
/* Create an XmlElementAttribute to override the
field that returns Instrument objects. The overridden field
returns Brass objects instead. */
XmlElementAttribute^ attr = gcnew XmlElementAttribute;
attr->ElementName = "Brass";
attr->Type = Brass::typeid;
// Add the element to the collection of elements.
attrs->XmlElements->Add( attr );
// Create the XmlAttributeOverrides object.
XmlAttributeOverrides^ attrOverrides = gcnew XmlAttributeOverrides;
/* Add the type of the class that contains the overridden
member and the XmlAttributes to override it with to the
XmlAttributeOverrides object. */
attrOverrides->Add( Orchestra::typeid, "Instruments", attrs );
// Create the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer^ s = gcnew XmlSerializer( Orchestra::typeid,attrOverrides );
// Writing the file requires a TextWriter.
TextWriter^ writer = gcnew StreamWriter( filename );
// Create the object that will be serialized.
Orchestra^ band = gcnew Orchestra;
// Create an object of the derived type.
Brass^ i = gcnew Brass;
i->Name = "Trumpet";
i->IsValved = true;
array<Instrument^>^myInstruments = {i};
band->Instruments = myInstruments;
// Serialize the object.
s->Serialize( writer, band );
writer->Close();
}
void DeserializeObject( String^ filename )
{
XmlAttributeOverrides^ attrOverrides = gcnew XmlAttributeOverrides;
XmlAttributes^ attrs = gcnew XmlAttributes;
// Create an XmlElementAttribute to override the Instrument.
XmlElementAttribute^ attr = gcnew XmlElementAttribute;
attr->ElementName = "Brass";
attr->Type = Brass::typeid;
// Add the XmlElementAttribute to the collection of objects.
attrs->XmlElements->Add( attr );
attrOverrides->Add( Orchestra::typeid, "Instruments", attrs );
// Create the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer^ s = gcnew XmlSerializer( Orchestra::typeid,attrOverrides );
FileStream^ fs = gcnew FileStream( filename,FileMode::Open );
Orchestra^ band = dynamic_cast<Orchestra^>(s->Deserialize( fs ));
Console::WriteLine( "Brass:" );
/* 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
(Brass), and cast the Instrument instance to it. */
Brass^ b;
System::Collections::IEnumerator^ myEnum = band->Instruments->GetEnumerator();
while ( myEnum->MoveNext() )
{
Instrument^ i = safe_cast<Instrument^>(myEnum->Current);
b = dynamic_cast<Brass^>(i);
Console::WriteLine( "{0}\n{1}", b->Name, b->IsValved );
}
}
int main()
{
SerializeObject( "Override.xml" );
DeserializeObject( "Override.xml" );
}
using System;
using System.IO;
using System.Xml.Serialization;
public class Orchestra
{
public Instrument[] Instruments;
}
public class Instrument
{
public string Name;
}
public class Brass:Instrument
{
public bool IsValved;
}
public class Run
{
public static void Main()
{
Run test = new Run();
test.SerializeObject("Override.xml");
test.DeserializeObject("Override.xml");
}
public void SerializeObject(string filename)
{
/* Each overridden field, property, or type requires
an XmlAttributes object. */
XmlAttributes attrs = new XmlAttributes();
/* Create an XmlElementAttribute to override the
field that returns Instrument objects. The overridden field
returns Brass objects instead. */
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "Brass";
attr.Type = typeof(Brass);
// Add the element to the collection of elements.
attrs.XmlElements.Add(attr);
// Create the XmlAttributeOverrides object.
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
/* Add the type of the class that contains the overridden
member and the XmlAttributes to override it with to the
XmlAttributeOverrides object. */
attrOverrides.Add(typeof(Orchestra), "Instruments", attrs);
// Create the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer s =
new XmlSerializer(typeof(Orchestra), attrOverrides);
// Writing the file requires a TextWriter.
TextWriter writer = new StreamWriter(filename);
// Create the object that will be serialized.
Orchestra band = new Orchestra();
// Create an object of the derived type.
Brass i = new Brass();
i.Name = "Trumpet";
i.IsValved = true;
Instrument[] myInstruments = {i};
band.Instruments = myInstruments;
// Serialize the object.
s.Serialize(writer,band);
writer.Close();
}
public void DeserializeObject(string filename)
{
XmlAttributeOverrides attrOverrides =
new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
// Create an XmlElementAttribute to override the Instrument.
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "Brass";
attr.Type = typeof(Brass);
// Add the XmlElementAttribute to the collection of objects.
attrs.XmlElements.Add(attr);
attrOverrides.Add(typeof(Orchestra), "Instruments", attrs);
// Create the XmlSerializer using the XmlAttributeOverrides.
XmlSerializer s =
new XmlSerializer(typeof(Orchestra), attrOverrides);
FileStream fs = new FileStream(filename, FileMode.Open);
Orchestra band = (Orchestra) s.Deserialize(fs);
Console.WriteLine("Brass:");
/* 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
(Brass), and cast the Instrument instance to it. */
Brass b;
foreach(Instrument i in band.Instruments)
{
b = (Brass)i;
Console.WriteLine(
b.Name + "\n" +
b.IsValved);
}
}
}
Option Explicit
Option Strict
Imports System.IO
Imports System.Xml.Serialization
Public Class Orchestra
Public Instruments() As Instrument
End Class
Public Class Instrument
Public Name As String
End Class
Public Class Brass
Inherits Instrument
Public IsValved As Boolean
End Class
Public Class Run
Public Shared Sub Main()
Dim test As New Run()
test.SerializeObject("Override.xml")
test.DeserializeObject("Override.xml")
End Sub
Public Sub SerializeObject(ByVal filename As String)
' Each overridden field, property, or type requires
' an XmlAttributes object.
Dim attrs As New XmlAttributes()
' Create an XmlElementAttribute to override the
' field that returns Instrument objects. The overridden field
' returns Brass objects instead.
Dim attr As New XmlElementAttribute()
attr.ElementName = "Brass"
attr.Type = GetType(Brass)
' Add the element to the collection of elements.
attrs.XmlElements.Add(attr)
' Create the XmlAttributeOverrides object.
Dim attrOverrides As New XmlAttributeOverrides()
' Add the type of the class that contains the overridden
' member and the XmlAttributes to override it with to the
' XmlAttributeOverrides object.
attrOverrides.Add(GetType(Orchestra), "Instruments", attrs)
' Create the XmlSerializer using the XmlAttributeOverrides.
Dim s As New XmlSerializer(GetType(Orchestra), attrOverrides)
' Writing the file requires a TextWriter.
Dim writer As New StreamWriter(filename)
' Create the object that will be serialized.
Dim band As New Orchestra()
' Create an object of the derived type.
Dim i As New Brass()
i.Name = "Trumpet"
i.IsValved = True
Dim myInstruments() As Instrument = {i}
band.Instruments = myInstruments
' Serialize the object.
s.Serialize(writer, band)
writer.Close()
End Sub
Public Sub DeserializeObject(filename As String)
Dim attrOverrides As New XmlAttributeOverrides()
Dim attrs As New XmlAttributes()
' Create an XmlElementAttribute to override the Instrument.
Dim attr As New XmlElementAttribute()
attr.ElementName = "Brass"
attr.Type = GetType(Brass)
' Add the XmlElementAttribute to the collection of objects.
attrs.XmlElements.Add(attr)
attrOverrides.Add(GetType(Orchestra), "Instruments", attrs)
' Create the XmlSerializer using the XmlAttributeOverrides.
Dim s As New XmlSerializer(GetType(Orchestra), attrOverrides)
Dim fs As New FileStream(filename, FileMode.Open)
Dim band As Orchestra = CType(s.Deserialize(fs), Orchestra)
Console.WriteLine("Brass:")
' 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
' (Brass), and cast the Instrument instance to it.
Dim b As Brass
Dim i As Instrument
For Each i In band.Instruments
b = CType(i, Brass)
Console.WriteLine(b.Name & ControlChars.Cr & b.IsValved)
Next i
End Sub
End Class
Hinweise
Dies XmlAttributeOverrides ermöglicht das XmlSerializer Außerkraftsetzen der Standardweise der Serialisierung einer Gruppe von Objekten. Überschreiben der Serialisierung auf diese Weise verfügt über zwei Verwendungen: Zunächst können Sie die Serialisierung von Objekten steuern und erweitern, die in einer DLL gefunden wurden, auch wenn Sie keinen Zugriff auf die Quelle haben; Zweitens können Sie einen Satz serialisierbarer Klassen erstellen, aber die Objekte auf mehrere Arten serialisieren. Anstelle der Serialisierung von Elementen einer Klasseninstanz als XML-Elemente können Sie sie beispielsweise als XML-Attribute serialisieren, wodurch ein effizienteres Dokument zum Transport ermöglicht wird.
Nachdem Sie ein XmlAttributeOverrides Objekt erstellt haben, übergeben Sie es als Argument an den XmlSerializer Konstruktor. Das Ergebnis XmlSerializer verwendet die Daten, die von den XmlAttributeOverrides Attributen überschrieben werden, die steuern, wie Objekte serialisiert werden. Dazu enthält die XmlAttributeOverrides Auflistung der Objekttypen, die außer Kraft gesetzt werden, sowie ein XmlAttributes Objekt, das jedem überschriebenen Objekttyp zugeordnet ist. Das XmlAttributes Objekt selbst enthält einen entsprechenden Satz von Attributobjekten, die steuern, wie jedes Feld, die Eigenschaft oder klasse serialisiert wird.
Der Prozess zum Erstellen und Verwenden eines XmlAttributeOverrides Objekts ist wie folgt:
Erstellen Sie ein XmlAttributes-Objekt.
Erstellen Sie ein Attributobjekt, das für das Überschreiben des Objekts geeignet ist. Wenn Sie z. B. ein Feld oder eine Eigenschaft außer Kraft setzen möchten, erstellen Sie eine XmlElementAttribute, mithilfe des neuen, abgeleiteten Typs. Sie können optional einen neuen Namen Namespace oder einen neuen ElementNameNamen oder Namespace der Basisklasse außer Kraft setzen.
Fügen Sie das Attributobjekt zur entsprechenden XmlAttributes Eigenschaft oder Auflistung hinzu. Sie würden beispielsweise die XmlElements Auflistung des XmlAttributes Objekts hinzufügenXmlElementAttribute, indem Sie den Elementnamen angeben, der überschrieben wird.
Erstellen Sie ein XmlAttributeOverrides-Objekt.
Fügen Sie mithilfe der Add Methode das XmlAttributes Objekt zum XmlAttributeOverrides Objekt hinzu. Wenn das Objekt außer Kraft gesetzt wird, XmlTypeAttributemüssen XmlRootAttribute Sie nur den Typ des überschriebenen Objekts angeben. Wenn Sie jedoch ein Feld oder eine Eigenschaft außer Kraft setzen, müssen Sie auch den Namen des überschriebenen Elements angeben.
Übergeben Sie beim Erstellen des XmlSerializerKonstruktors den XmlAttributeOverrides XmlSerializer Konstruktor.
Verwenden Sie die resultierende XmlSerializer Verwendung, um die abgeleiteten Klassenobjekte zu serialisieren oder zu deserialisieren.
Konstruktoren
XmlAttributeOverrides() |
Initialisiert eine neue Instanz der XmlAttributeOverrides-Klasse. |
Eigenschaften
Item[Type, String] |
Ruft das dem angegebenen (Basisklassen-)Typ zugeordnete Objekt ab. Durch den member-Parameter wird der zu überschreibende Member der Basisklasse angegeben. |
Item[Type] |
Ruft das dem angegebenen Basisklassentyp zugeordnete Objekt ab. |
Methoden
Add(Type, String, XmlAttributes) |
Fügt der Auflistung von XmlAttributes-Objekten ein XmlAttributes-Objekt hinzu. Der |
Add(Type, XmlAttributes) |
Fügt der Auflistung von XmlAttributes-Objekten ein XmlAttributes-Objekt hinzu. Der |
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Gilt für
Siehe auch
- Deserialize(Stream)
- Serialize(TextWriter, Object)
- XmlSerializer
- XmlAttributes
- Einführung in die XML-Serialisierung
- Vorgehensweise: Angeben eines alternativen Elementnamens für einen XML-Stream
- Steuern der XML-Serialisierung mit Attributen
- Beispiele für die XML-Serialisierung
- XML Schema Definition-Tool (Xsd.exe)