2009-05-22 25 views
5

Tengo una clase en .NET que implementa IXmlSerializable. Quiero serializar sus propiedades, pero pueden ser tipos complejos. Estos tipos complejos serían compatibles con la serialización de XML, pero no implementan ellos mismos IXmlSerializable. De mis métodos ReadXml y WriteXml, ¿cómo invoco la lógica de lectura/escritura predeterminada en XmlReader/XmlWriter que me es pasada?Cómo utilizar la serialización XML predeterminada desde los métodos de serialización XML personalizados

Quizás código hará que sea más claro lo que quiero:

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, ¿tiene más preguntas al respecto? Creo que te han dado la respuesta. –

+0

El método ReadSubtree fue la clave para resolver el problema. No he marcado la respuesta actual como aceptada porque no explica exactamente cómo hacer esto. –

Respuesta

9

Para el escritor, sólo podría crear un XmlSerializer para la MySerializableType, a continuación, serializar la lista a través de él a su escritor.

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 
} 

Hay un enfoque similar para el lector. EDIT: Para leer solo la lista, y para dejar de leer después de que la Lista esté completa, pero antes del final de la transmisión, necesita usar ReadSubTree (crédito Marc Gravell).

+2

Re el último punto: ReadSubtree: http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx –

+0

ReadSubTree, genial! ¡Aprendí algo nuevo! – Cheeso