使用XmlSerializer的LinkedList can't be serialized。
现在,如何从序列化的objet 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); }
}
}
我获得了什么(addind名称,年龄和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>
因此,链表中的项目尚未序列化...... :(
答案 0 :(得分:4)
一种可能性是创建一个包含与链表相同对象的可序列化集合。例如。 (另):
LinkedList<Foo> ll = PopulateLinkedList();
List<Foo> list = new List<Foo>(ll);
然后序列化list
。如果Foo
是引用类型,这不会产生大量开销,并且您不关心插入/删除现在更昂贵的事实b / c您只使用{{ 1}}保存对数据的引用以进行序列化和反序列化。当您将其从序列化流中拉出时,您可以将其重新转换为List<T>
以获得您首先使用链接列表的所有优势。
这是一个我刚刚开始演示的小控制台应用程序。我是在VS2008中做到的,但我认为我没有使用任何令人惊讶的东西 - 只是数组初始化语法来节省一些垂直空间。
示例代码:
LinkedList<T>
主要的应用程序代码:
[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;
}
}