2010-02-16 69 views
0

.NET 2如何Xml序列化LinkedList?

其实有方法,以XML序列化List<T>。 如果我有一个对象具有公共LinkedList<T>成员,该怎么办?

没有创建公共副本List<T>LinkedList<T>。也许一种控制Xml序列化的方式就像二进制(OnSerializing,OnDeserializing)。

将不可能XML序列化与公众LinkedList<T>成员的对象?

编辑:

的试验例与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 
    } 
} 
+0

的可能重复的[链表不能使用XmlSerializer被序列化(http://stackoverflow.com/questions/2237584/linkedlistt-can-not-be-serialized-using-the-xmlserializer) – nawfal 2014-07-16 21:49:15

回答

2

这是不可能用修复而不实施IXmlSerializable或从LinkedList<T>建立公开重复如List<T>DataContractSerializer能够做到这一点,但不幸的是它不能在.NET 2.0中使用。


UPDATE:

这里的实施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没有多少好处这里。

+0

有趣IXmlSerializable的...我如何序列化一个LinkedList的样本? – serhio 2010-02-16 09:28:20

+0

是的,看我的更新。 – 2010-02-16 09:34:53

+0

谢谢,这很有趣。现在,更精确一点。如果LinkedList ,其中T是一个自定义对象(称为“Bar”),该怎么办? Bar也可以是XmlSerailizable,也可以是自定义的XmlSerializable,也可以不是Serializable。 – serhio 2010-02-16 09:43:56