2009-06-05 9 views
4

Xmlで内部クラスをシリアライズする必要があるため、IXmlSerializableを実装する必要があります。コレクションを含むクラスにIXmlSerializableを実装する

このクラスには2つの文字列とリストがあります。

私はWriteElementString & ReadElementContentAsStringを使って文字列を読み書きすることを知っています。

しかし、私はどのように読むのか迷っています& ReadXml & WriteXmlメソッドのリストを書いてください。

これを行うにはどうすればよいですか、内部アクセシビリティを維持しながらオブジェクトを直列化および逆シリアル化する方法はありますか?

+0

、私が知っている私は(http://paltman.com/2006/jul/03/ixmlserializable-a-persistable-example/)[ビットをシフト]でした –

答えて

8

リスト自体に<List>要素を書き込み、項目をループして<Item>要素として書き出します。

エレメントがXMLシリアライズ可能なクラスのインスタンスである場合は、エレメントのタイプのXmlSerializerインスタンスを作成し、それぞれをすでに使用しているのと同じXmlWriterにシリアル化することができます。例:あなたは、このリンクが役に立つかもしれません


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 <>はIXmlSerializableを実装していません。パブリックアクセスのためにシリアル化可能です。 私は上記のように記述することを理解していますが、リスト内の項目をコードでネストするにはどうすればいいですか?これを達成するには、どの方法を検討しなければなりませんか? –

+1

ここにサンプルとしてコード内のラッパー要素に問題があります(http://www.codeproject.com/KB/XML/ImplementixmlSerializable.aspxはReadXmlとWriteXmlを正しく実装する方法を説明しています) – jdehaan

関連する問題