2009-05-22 2 views
5

Ich habe eine Klasse in .NET, die IXmlSerializable implementiert. Ich möchte seine Eigenschaften serialisieren, aber sie können komplexe Typen sein. Diese komplexen Typen sind mit der XML-Serialisierung kompatibel, implementieren IXmlSerializable jedoch nicht selbst. Wie lade ich von meinen ReadXml- und WriteXml-Methoden die Standard-Lese-/Schreiblogik für den XmlReader/XmlWriter, der an mich übergeben wird.Verwendung der XML-Standardserialisierung aus benutzerdefinierten XML-Serialisierungsmethoden

Vielleicht Code macht es klarer, was ich will:

public class MySpecialClass : IXmlSerializable 
{ 
    public List<MyXmlSerializableType> MyList { get; set; } 

    System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() 
    { 
     return null; 
    } 

    void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) 
    { 
     // Read MyList from reader, but how? 
     // Something like this? 
     // MyList = (List<MyXmlSerializableType>) 
      reader.ReadObject(typeof(List<MyXmlSerializableType>)); 
    } 

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
    { 
     // Write MyList to writer, but how? 
     // Something like this? 
     // writer.WriteObject(MyList) 

    } 
} 
+0

Daniel, hast du mehr Fragen dazu? Ich denke, du hast die Antwort bekommen. –

+0

Die ReadSubtree-Methode war der Schlüssel zur Lösung des Problems. Ich habe die aktuelle Antwort nicht als akzeptiert markiert, weil sie nicht genau erklärt, wie dies zu tun ist. –

Antwort

9

Für den Schriftsteller, könnten Sie gerade einen XmlSerializer für die MySerializableType erstellen, dann serialisiert die Liste durch, um sie Ihren Schriftsteller.

void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
{ 
    // write xml decl and root elts here 
    var s = new XmlSerializer(typeof(MySerializableType)); 
    s.Serialize(writer, MyList); 
    // continue writing other elts to writer here 
} 

Es gibt einen ähnlichen Ansatz für den Leser. EDIT: Um nur die Liste zu lesen, und um zu lesen, nachdem die Liste abgeschlossen ist, aber vor dem Ende des Streams, müssen Sie ReadSubTree (Kredit Marc Gravell) verwenden.

+2

Re der letzte Punkt: ReadSubtree: http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx –

+0

ReadSubTree, cool! Ich habe etwas Neues gelernt! – Cheeso