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

本文关键字:序列化 不能 接口 抽象类 为什么 XmlSerializer | 更新日期: 2023-09-27 18:20:07

编辑这段代码应该说明整个问题:

[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();
    }
}

aSerializer生成的第一个text将是:

<?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>

而不是抛出异常。

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

您可以序列化接口,但不像类那么简单:

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

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

第一个原因是从实践的角度;序列化界面有点模糊。你觉得序列化程序怎么样传入接口引用时应该序列化吗?如果你序列化反序列化的接口属性,然后可能会中途未初始化的对象。不知道这会对你造成什么影响您的申请。

如果将完整对象与类型信息一起序列化,则序列化接口并没有给你带来任何好处。你可以键入如果您的应用程序真的关心那里有什么物体。

第二个与XmlSerializer的声明目的一致。即使.NET Framework中的XML序列化这个令人误解的名称实际上是一个数据绑定技术,主要目的是映射定义的MXL数据类型在XSD架构中转换为.NET类型。XSD定义了解抽象基础类,但由于它是以数据为中心的,所以对接口。考虑到这一点,几乎没有动力支持XmlSerializer中的接口。

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