2009-05-22 2 views
5

Ho una classe in .NET che implementa IXmlSerializable. Voglio serializzare le sue proprietà, ma possono essere tipi complessi. Questi tipi complessi sarebbero compatibili con la serializzazione XML, ma non implementano IXmlSerializable. Dai miei metodi ReadXml e WriteXml, come faccio a richiamare la logica di lettura/scrittura predefinita su XmlReader/XmlWriter che mi è stata passata.Come utilizzare la serializzazione XML predefinita da metodi di serializzazione XML personalizzati

Forse codice renderlo più chiaro quello che voglio:

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, hai altre domande su questo? Penso che ti sia stata data la risposta. –

+0

Il metodo ReadSubtree era la chiave per risolvere il problema. Non ho contrassegnato la risposta corrente come accettata perché non spiega esattamente come farlo. –

risposta

9

Per lo scrittore, si può solo creare un XmlSerializer per la MySerializableType, quindi serializzare l'elenco attraverso di essa per il vostro scrittore.

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 
} 

C'è un approccio simile per il lettore. EDIT: Per leggere solo l'elenco e per interrompere la lettura dopo che l'Elenco è completo, ma prima della fine dello stream, è necessario utilizzare ReadSubTree (credito Marc Gravell).

+2

Re l'ultimo punto: ReadSubtree: http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx –

+0

ReadSubTree, cool! Ho imparato qualcosa di nuovo! – Cheeso