2009-06-19 10 views
5

habe ich Testanwendung erstellen, die drei Klassen hatXmlSerializer.Serialize mehrdeutig

  • Auto
  • Funk
  • Sportcar: Auto (verfügt über ein Radio)

Wie der serialize Prozess, wenn ich Instanz des XmlSerializer-Objekts erstellen Ich verwende 2 Objekte zum Testen

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar)); 

und

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

Das Ergebnis dieser 2 Ansatz ist identisch, so dass ich möchte wissen, was ist der Unterschied zwischen diesen zwei Konstruktor oder kritischen Punkt, der # 2-Konstruktor verwenden?

Antwort

8

Der große Unterschied ist, wenn Sie XmlSerializer über Unter Klassen zu sagen brauchen - zum Beispiel:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car), 
    new Type[] { typeof(SportCar), typeof(Radio) }); 

Hier ohne die zusätzlichen Informationen, wenn wäre etwa nicht bekannt (nur aus Car) entweder SportCar oder Radio - so, wenn Sie es ein Objekt geben, das ist eigentlich ein SportCar, wäre es fehl:

Car car = new SportCar {...}; 
xmlSerializer.Serialize(destination, car); 

Sie können dies auch tun, indem Einstellung [XmlInclude(typeof(SportCar))] gegen die Car Typdefinition:

[XmlInclude(typeof(SportCar))] 
public class Car {...} 

Das ist einfacher, ist aber nur möglich, wenn der Car Typ in einer Baugruppe, die SportCar kennt. Aber Sie oft tun wissen dies, so XmlInclude ist die bevorzugte Option.

Zusätzlich: Es gibt einige Effizienzvorteile von XmlInclude; Hinter den Kulissen verwendet das System die dynamische Typgenerierung, um XmlSerializer effizient zu machen. Aus diesem Grund sollten Sie die XmlSerializer Instanz, die Sie erstellen, im Allgemeinen behalten (und wiederverwenden); zum Beispiel durch Speichern in einem statischen Feld. Das System führt dies jedoch automatisch für die Standardverwendung (new XmlSerializer(typeof(Car))) durch - d. H. Egal wie oft Sie diesen Konstruktor verwenden, wird der dynamische Code nur einmal generiert. Wenn Sie den komplexeren Konstruktor verwenden (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })), wird jedes Mal die Typgenerierung durchgeführt.

+0

Was ist der Unterschied in der Ausgabe, wenn ich die Sub-Klasse Info angeben? (Ich bin neu im Serialisierungsprozess) – Anonymous

+1

Es gibt keinen Unterschied in der Ausgabe zwischen der Verwendung des XmlInclude-Ansatzes und dem Konstruktor (new Type []) -Ansatz; sie sind gleichwertig. Wenn Sie keine und fragen nach einem XmlSerializer (typeof (Auto)), aber geben Sie ihm ein SportCar - es wird eine Ausnahme auslösen. –

+0

Ich sehe, nach dem Lesen von Thema über XmlSerializer auf C# 3.0 in Kürze und zurück, um Ihre Antwort zu lesen, die über "über Sub-Klassen" erwähnen, es verstehe mich, wie XmlSerializer arbeiten. (Ich kaufe ein anderes Buch, um auf C# zu lernen, schade.) – Anonymous