2009-06-05 70 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

相关问题