编辑该代码应该说明整个问题:
[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中的接口.