.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
}
}
答案 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
没有太大的好处。