修改此代码应说明整个问题:
[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>
而不是抛出异常。
答案 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没有序列化抽象类。它正在序列化几个具体的类中的一个。