为什么不能像IList <t>那样将接口序列化到Xml文件中?</t>

时间:2012-04-03 15:11:38

标签: c# xml serialization interface xml-serialization

我正在尝试将一个声明为ILIst的对象序列化到Xml文件中,但它是List的一个实例。异常告诉我原因:您无法序列化接口。

这在我的设计中是非常必要的,或者我还有什么方法可以序列化它?

5 个答案:

答案 0 :(得分:2)

您必须知道要实例化的具体类型。

序列化程序必须使用元数据,而不是运行时类型。如果您只知道您的目标对象必须实现IList,那么您将构建什么?甚至没有一个类实现它。

答案 1 :(得分:1)

这应该不是问题,你总是可以使用object.GetType()。这是一个例子:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

class Program {
    static void Main(string[] args) {
        System.Collections.IList list = new List<int> { 1, 2, 3 };
        var ser = new XmlSerializer(list.GetType());
        ser.Serialize(Console.Out, list);
        Console.ReadLine();
    }
}

答案 2 :(得分:1)

我认为您需要使用 IList 保持设计的原因是因为它是其他模块的通用接口。一种可能的解决方案:

而不是:

    [XmlElement("Test")]
    public IList<String> Tests
    {
        get;
        set;
    }

您可以尝试:

    [XmlElement("Test")]
    public List<String> TestList
    {
        get;
        set;
    }

    [XmlIgnore]
    public IList<String> Tests
    {
        get { return TestList; }
    }

通过这种方式,您可以保持相同的界面,同时利用.Net Xml库中的序列化/反序列化功能。

答案 3 :(得分:0)

我可以看到两个选项:

  1. 您可以在将其传递给序列化程序之前将其强制转换回List。不理想,但它会起作用。
  2. 您遍历IList并将每个项目序列化为相同的流。

答案 4 :(得分:0)

您无法序列化接口,因为它不包含任何数据。您可以做的最好的事情就是实现ISerializable来自行控制序列化。