为什么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>
而不是抛出异常。
您可以序列化接口,但不像类那么简单:
http://ventspace.wordpress.com/2010/02/20/how-to-serialize-interfaces-in-net/
但为了回答你的问题,我对此有两个猜测:
第一个原因是从实践的角度;序列化界面有点模糊。你觉得序列化程序怎么样传入接口引用时应该序列化吗?如果你序列化反序列化的接口属性,然后可能会中途未初始化的对象。不知道这会对你造成什么影响您的申请。
如果将完整对象与类型信息一起序列化,则序列化接口并没有给你带来任何好处。你可以键入如果您的应用程序真的关心那里有什么物体。
第二个与XmlSerializer的声明目的一致。即使.NET Framework中的XML序列化这个令人误解的名称实际上是一个数据绑定技术,主要目的是映射定义的MXL数据类型在XSD架构中转换为.NET类型。XSD定义了解抽象基础类,但由于它是以数据为中心的,所以对接口。考虑到这一点,几乎没有动力支持XmlSerializer中的接口。
XmlSerializer未序列化抽象类。它正在序列化几个具体类中的一个。