14

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

我希望序列化一个S包含我定义的另一个类的类型IList<T>的属性的类(我们称之为它)。T当我尝试将类的实例序列化为SXML 时出现异常。这是可以理解的,因为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>序列化/反序列化时的一个实例”。

4

3 回答 3

13

更改

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

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

然后它将起作用。

于 2012-04-04T14:08:17.267 回答
3

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

一种是使用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>();
    }
}
于 2012-04-04T14:16:19.547 回答
0

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

于 2012-04-04T14:12:20.183 回答