如何序列化IList <t> </t>等接口

时间:2012-04-04 14:04:06

标签: c# list interface xml-serialization

  

可能重复:
  How to serialize an 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>的实例。”

3 个答案:

答案 0 :(得分:14)

更改

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

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

然后它会起作用。

答案 1 :(得分:2)

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

一个是使用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>();
    }
}

答案 2 :(得分:0)

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