【问题标题】:Why can XmlSerializer serialize abstract classes but not interfaces?为什么 XmlSerializer 可以序列化抽象类但不能序列化接口?
【发布时间】:2012-01-13 03:40:17
【问题描述】:

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

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

而不是抛出异常。

【问题讨论】:

  • 你试过编译你的代码吗?我认为上面的代码不会编译。另外,请发布您用于序列化的代码。这将更容易说明问题所在。
  • @JohnSaunders:查看我的更新,我认为现在应该很清楚了。
  • 郑重声明,您收到的完整异常是什么?
  • “无法序列化接口 IThing。”是最内在的例外。上面的那个没有任何帮助。但是如果你将List&lt;IThing&gt; 作为一个类的成员,你会得到类似“不能序列化成员......因为它是一个接口”。

标签: c# .net xmlserializer


【解决方案1】:

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

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

但要回答您的问题,我对此有 2 种猜测:

第一个原因是从实际方面;序列化的语义 界面有点模糊。你觉得序列化器怎么样 传入接口引用时应该序列化吗?如果你只 序列化您反序列化的接口属性,然后可能会结束 中途未初始化的对象。没有人知道那会做什么 你的申请。

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

第二个符合 XmlSerializer 的既定目的。尽管 .NET 框架中的误导性名称 XML 序列化实际上是一个数据 主要用于映射定义的 MXL 数据类型的绑定技术 在 XSD 架构中转换为 .NET 类型。 XSD 定义了解抽象基 类,但由于它是以数据为中心的,所以对它一无所知 接口。考虑到这一点,几乎没有动力支持 XmlSerializer 中的接口。

【讨论】:

    【解决方案2】:

    XmlSerializer 不序列化抽象类。它正在序列化几个具体类之一。

    【讨论】:

    • 那么,为什么不能对接口做同样的事情呢?
    • 我指的具体类是你在XmlInclude中引用的类
    • 我明白你在说什么,但不明白你的意思。为什么XmlSerializer 不能序列化实现接口的具体类,就像它可以序列化实现抽象类的具体类一样,其中要序列化的对象位于我在问题中给出的示例声明的列表中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2016-10-14
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多