2009-06-05 68 views
4

我需要能夠Xml序列化一個內部的類,所以我必須實現IXmlSerializable。爲包含集合的類實現IXmlSerializable

該類有兩個字符串和一個List。

我知道使用WriteElementString來讀寫字符串& ReadElementContentAsString。

但是,我迷失在如何閱讀&在ReadXml中寫入List & WriteXml方法。

我該怎麼做,或者有沒有辦法在保持內部可訪問性的同時對對象進行序列化和反序列化?

+0

您可能會發現這個鏈接有用的,我知道我沒有[狡詐位(http://paltman.com/2006/jul/03/ixmlserializable-a-persistable-example/) – 2009-06-05 14:09:09

回答

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,它是可序列化的,因爲它是公共訪問。 我知道他們是像上面說的那樣寫的,但是如何在代碼中嵌套列表中的項目,然後如何將它們從嵌套中移除?我應該注意哪些方法來實現這一點? – 2009-06-05 13:47:50

+1

代碼中的包裝器元素存在問題,可以在此處示例(http://www.codeproject.com/KB/XML/ImplementIXmlSerializable.aspx說明如何正確實現ReadXml和WriteXml) – jdehaan 2009-10-31 12:21:45

相關問題