如何序列化诸如IList<;T>;

本文关键字:gt lt IList 序列化 | 更新日期: 2023-09-27 18:30:03

可能重复:
如何序列化IList<T>?

我希望序列化一个类(让我们称之为S),该类包含类型为IList<T>的属性,其中T是我定义的另一个类。当我试图将类S的实例序列化为XML时,遇到了一个异常。这是可以理解的,因为XmlSerializer不知道使用哪个具体类。有没有一种方法(希望是使用属性)可以指定在序列化/反序列化实例时实例化哪个具体类。我对类S的实现创建了List<T>类的一个实例。下面是一些代码来说明我的例子:

using System;
using System.Xml.Serialization;
using System.IO;
[Serializable]
public class T { }
[Serializable]
public class S
{
    public IList<T> ListOfTs { get; set; }
    public S()
    {
        ListOfTs = new List<T>();
    }
}
public class Program
{
    public void Main()
    {
        S s = new S();
        s.ListOfTs.Add(new T());
        s.ListOfTs.Add(new T());
        XmlSerializer serializer = new XmlSerializer(typeof(S));
        serializer.Serialize(new StringWriter(), s);
    }
}

我希望有一个属性可以放在ListOfTs定义之上,它对序列化程序说,"在序列化/反序列化时假设List<T>的实例"。

如何序列化诸如IList<;T>;

更改

public IList<T> ListOfTs { get; set; }

public List<T> ListOfTs { get; set; }

然后它就会起作用。

我认为通常有两种方法可以解决这类问题。

一种方法是使用DataContractSerializer,但由于您已经在使用XmlSerializer了,您可能不想这样做。

"备选方案"是具有专门用于序列化的属性,并在序列化期间忽略IList。

[Serializable]
public class S
{
    IList<T> _listofTs;
    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }
    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }
    public S()
    {
        ListOfTs = new List<T>();
    }
}

您可以使用Xml读写器手动实现IXmlSerializable接口和序列化逻辑。