为什么XmlSerializer可以序列化抽象类而不是接口?

时间:2012-01-13 03:40:17

标签: c# .net xmlserializer

修改此代码应说明整个问题:

[XmlInclude(typeof(AThing1))]
public abstract class AThing
{
    public abstract string Name { get; set; }
}

[XmlInclude(typeof(IThing1))]
public interface IThing
{
    string Name { get; set; }
}

public class AThing1 : AThing
{
    public override string Name { get; set; }
}

public class IThing1 : IThing
{
    public string Name { get; set; }
}

List<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } });
List<IThing> iThings = new List<IThing>(new IThing[] { new IThing1() { Name = "Bob" } });

public void Test()
{
    using (StringWriter sw = new StringWriter())
    {
        XmlSerializer aSerializer = new XmlSerializer(typeof(List<AThing>));
        aSerializer.Serialize(sw, aThings);
        string text = sw.ToString();
    }

    using (StringWriter sw = new StringWriter())
    {
        // This line will throw "Cannot serialize interface IThing.":
        XmlSerializer iSerializer = new XmlSerializer(typeof(List<IThing>));    
        iSerializer.Serialize(sw, iThings);
        string text = sw.ToString();
    }
}

text生成的第一个aSerializer将是:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AThing xsi:type="AThing1">
    <Name>Bob</Name>
  </AThing>
</ArrayOfAThing>

我不明白为什么iSerializer无法做到这一点:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfIThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <IThing xsi:type="IThing1">
    <Name>Bob</Name>
  </IThing>
</ArrayOfIThing>

而不是抛出异常。

2 个答案:

答案 0 :(得分:5)

你可以序列化界面,但不像类那么简单:

http://ventspace.wordpress.com/2010/02/20/how-to-serialize-interfaces-in-net/

但为了回答你的问题,我对此有两个猜测:

第一个原因是从实践方面来看;序列化的语义 界面有点模糊。您认为序列化器是什么? 传递接口引用时应该序列化吗?如果你只是 序列化您反序列化的接口属性然后可以结束 一个未经初始化的未初始化对象。没有人知道会怎样做 你的申请。

如果您将完整对象与类型信息一起序列化,那么 序列化界面真的没有给你买任何东西。你可以输入 如果您的应用程序真的,首先将引用作为类类型 关心那里有什么对象。

第二个符合XmlSerializer的声明目的。尽管 .NET Framework中误导性名称XML Serialization确实是一种数据 绑定技术的主要目的是映射定义的MXL数据类型 在XSD架构中的.NET类型。 XSD定义了解抽象基础 类,但由于它以数据为中心,不知道任何事情 接口。考虑到这一点,没有动力去支持 XmlSerializer中的接口。

答案 1 :(得分:2)

XmlSerializer没有序列化抽象类。它正在序列化几个具体的类中的一个。