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中的接口. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |