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

前端之家收集整理的这篇文章主要介绍了c# – 为什么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();
    }
}

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

而不是抛出异常.

解决方法

你可以串行化接口,但不像类一样简单:

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

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

第一个原因来自实践的一面;序列化的语义
界面有点模糊.你认为串行器是什么?
当你通过接口引用时应该序列化?如果你只有
序列化您的反序列化的接口属性,然后可以卷起
一个半途未初始化的对象.没有告诉你会做什么
你的申请.

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

第二个与XmlSerializer的所述目的一致.尽管.NET Framework中的误导性名称XML序列化真的是一个数据绑定技术主要用于映射定义的MXL数据类型在XSD模式到.NET类型. XSD定义了解抽象基础课程,但由于它以数据为中心,不了解任何内容接口.考虑到这一点,没有什么动力支持XmlSerializer中的接口.

猜你在找的C#相关文章