2009-06-05 1 views
4

Ich muss Xml serialisieren eine Klasse, die intern ist, so muss ich IXmlSerializable implementieren.Implementieren IXmlSerializable für Klassen mit Collections

Diese Klasse hat zwei Strings und eine Liste.

Ich weiß, die Zeichenfolgen mit WriteElementString & ReadElementContentAsString zu lesen und zu schreiben.

Allerdings bin ich verloren, wie man liest & schreibe die Liste in der ReadXml & WriteXml Methoden.

Wie mache ich das, oder gibt es eine Möglichkeit, das Objekt zu serialisieren und zu deserialisieren, während die interne Zugänglichkeit beibehalten wird?

+0

Sie können diesen Link nützlich finden, ich weiß, ich habe [Shifting Bits] (http://paltman.com/2006/jul/03/ixmlserializable-a-persistable-example/) –

Antwort

8

Schreiben Sie einfach ein <List> Element für die Liste selbst, dann durchlaufen Sie die Elemente und schreiben Sie sie als <Item> Elemente aus.

Wenn die Elemente Instanzen einer Klasse sind, die serialisiert werden kann, können Sie eine XmlSerializer-Instanz für den Typ des Elements erstellen und diese dann jeweils mit demselben XmlWriter serialisieren, den Sie bereits verwenden. Beispiel:


public void WriteXml(XmlWriter writer) 
{ 
    writer.WriteStartElement("XmlSerializable"); 

    writer.WriteElementString("Integer", Integer.ToString()); 

    writer.WriteStartElement("OtherList"); 
    writer.WriteAttributeString("count", OtherList.Count.ToString()); 

    var otherSer = new XmlSerializer(typeof(OtherClass)); 
    foreach (var other in OtherList) 
    { 
     otherSer.Serialize(writer, other); 
    } 
    writer.WriteEndElement(); 

    writer.WriteEndElement(); 
} 

public void ReadXml(XmlReader reader) 
{ 
    reader.ReadStartElement("XmlSerializable"); 

    reader.ReadStartElement("Integer"); 
    Integer = reader.ReadElementContentAsInt(); 
    reader.ReadEndElement(); 

    reader.ReadStartElement("OtherList"); 
    reader.MoveToAttribute("count"); 
    int count = int.Parse(reader.Value); 

    var otherSer = new XmlSerializer(typeof (OtherClass)); 
    for (int i=0; i<count; i++) 
    { 
     var other = (OtherClass) otherSer.Deserialize(reader); 
     OtherList.Add(other); 
    } 

    reader.ReadEndElement(); 
    reader.ReadEndElement(); 
} 
+2

List <> implementiert IXmlSerializable nicht, es ist serialisierbar, da es öffentlich zugänglich ist. Ich verstehe, sie wie oben beschrieben zu schreiben, aber wie verschachtle ich die Elemente in der Liste im Code, und wie entferne ich sie später aus dem Nest? Mit welchen Methoden sollte ich das erreichen? –

+1

Es gibt Probleme mit dem Wrapper-Element im Code als Beispiel hier (http://www.codeproject.com/KB/XML/ImplementIXmlSerializable.aspx erklärt, wie Sie ReadXml und WriteXml richtig implementieren) – jdehaan