如何Xml序列化LinkedList?

时间:2010-02-16 08:55:33

标签: .net .net-2.0 xml-serialization

.NET 2

实际上有一些XML序列化List<T>的方法。 如果我有一个拥有公共LinkedList<T>成员的对象怎么办?

不从List<T>创建LinkedList<T>的公开副本。也许是一种控制Xml序列化的方法,如二进制(OnSerializing,OnDeserializing)。

使用公共LinkedList<T>成员对XML序列化对象是不可能的?

编辑:

使用IXmlSerializable修复的测试示例

using System.Xml.Serialization;

public class Foo : IXmlSerializable {        
    private int _Id;
    private string _Name;

    public string Name {
        get { return _Name; }
        set { _Name = value; }
    }        
    
    private int _Age;
    public string Age {
        get { return _Age; }
        set { _Age = value; }
    }
    
    private LinkedList<Bar> _linkedList = new LinkedList<Bar>();
    [XmlArray()]
    public List<Bar> MyLinkedList {
        get { return _linkedList; }
        set { _linkedList = value; }
    }
    
    public System.Xml.Schema.XmlSchema GetSchema() {
        return null;
    }
    
    public void ReadXml(System.Xml.XmlReader reader) {
        _Name = reader.ReadString(); // ? '            
        _Age = reader.ReadString(); // ? '
        // foreach MyLinkedList 
    }
    
    public void WriteXml(System.Xml.XmlWriter writer) {
        writer.WriteString(_Name); // ? '
        writer.WriteString(_Age); // ? '
        // foreach MyLinkedList 
    }
}

1 个答案:

答案 0 :(得分:2)

XmlSerializer无法实施IXmlSerializable或从List<T>创建LinkedList<T>公开副本,这是不可能的。 DataContractSerializer能够做到这一点,但遗憾的是它在.NET 2.0中不可用。


更新:

以下是实施IXmlSerializable序列化LinkedList<T>

的示例
public class Foo : IXmlSerializable
{
    public LinkedList<int> List { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        throw new System.NotImplementedException();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement("List");
        foreach (var item in List)
        {
            writer.WriteElementString("Item", item.ToString());    
        }
        writer.WriteEndElement();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo
        {
            List = new LinkedList<int>(new[] { 1, 2, 3 })
        };
        var serializer = new XmlSerializer(foo.GetType());
        serializer.Serialize(Console.Out, foo);
    }
}

正如您所看到的那样,它基本上都是手动进行序列化,因此XmlSerializer没有太大的好处。