【问题标题】:LinkedList<T> can not be serialized using the XMLSerializerLinkedList<T> 无法使用 XMLSerializer 进行序列化
【发布时间】:2010-02-10 14:46:22
【问题描述】:

使用 XmlSerializer 的 LinkedList can't be serialized

现在,如何从序列化的对象 LinkedList 中保存/检索数据。我应该实现自定义序列化吗?

我想做什么:

using System.Xml.Serialization;

[Serializable()]
public class TestClass
{
    private int _Id;
    private string _Name;
    private int _Age;
    private LinkedList<int> _linkedList = new LinkedList<int>();

    public string Name {
        get { return _Name; }
        set { _Name = value; }
    }
    
    public string Age {
        get { return _Age; }
        set { _Age = value; }
    }
    
    [XmlArray()]
    public List<int> MyLinkedList {
        get { return new List<int>(_linkedList); }
        set { _linkedList = new LinkedList<int>(value); }
    }
}

我得到了什么(添加姓名、年龄和 mylinkedlist 中的一些项目):

<?xml version="1.0"?>
<TestClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>testName</Name>
  <Age>10</Age>
  <MyLinkedList />
</TestClass>

所以,链表中的项目还没有被序列化... :(

【问题讨论】:

  • 也许您的测试代码错误地将元素添加到集合中?我将使用示例代码更新我的答案。

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


【解决方案1】:

一种可能性是创建一个包含与链表相同的对象的可序列化集合。例如。 (未经测试):

LinkedList<Foo> ll = PopulateLinkedList();
List<Foo> list = new List<Foo>(ll);

然后序列化list。如果Foo 是引用类型,这不会产生很多开销,并且您不关心插入/删除现在更昂贵的事实 b/c 您只使用List&lt;T&gt; 来保存对数据的引用以用于序列化和反序列化目的。当您将其从序列化流中拉出时,您只需将其转回 LinkedList&lt;T&gt; 即可获得您最初使用链表的所有优势。


这是我刚刚准备演示的一个小控制台应用程序。我在 VS2008 中做过,但我认为我没有使用任何令人惊讶的东西——只是数组初始化语法来节省一些垂直空间。

示例代码:

[Serializable]
public class MyClass
{
    private string name;
    private int age;
    private LinkedList<int> linkedList = new LinkedList<int>();

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    [XmlArray]
    public List<int> MyLinkedList
    {
        get { return new List<int>(linkedList); }
        set { linkedList = new LinkedList<int>(value); }
    }
}

及主要应用代码:

class Program
{
    static void Main(string[] args)
    {
        MyClass c = new MyClass();

        c.Age = 42;
        c.Name = "MyName";
        c.MyLinkedList = new List<int>() { 1, 4, 9 }; // Your property impl requires this be set all at once, not one element at a time via the property.

        XmlSerializer s = new XmlSerializer(typeof(MyClass));
        StringWriter outStream = new StringWriter();
        s.Serialize(outStream, c);

        Console.Write(outStream.ToString());

        return;
    }
}

这会将以下内容踢到控制台:

<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>MyName</Name>
  <Age>42</Age>
  <MyLinkedList>
    <int>1</int>
    <int>4</int>
    <int>9</int>
  </MyLinkedList>
</MyClass>

【讨论】:

  • @Daniel A. White:是的。我不记得是否在更高版本的框架中引入了它,而且我不想查找它。 :)
  • 我使用 .NET2。更新了尝试。
  • 这当然很酷。现在,如果我有一个公开的LinkedList 成员怎么办?不是List&lt;T&gt;,而是LinkedList&lt;T&gt;。然而,LinkedList 不是列表,反之亦然。
  • @serhio:将当前在属性中的代码(从LinkedList&lt;T&gt; 创建List&lt;T&gt;)提取到您的序列化代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多