C#中的XMLSerialization
时间:2020-03-05 18:52:32 来源:igfitidea点击:
我有一个明确实现接口的简单类型。
public interface IMessageHeader { string FromAddress { get; set; } string ToAddress { get; set; } } [Serializable] public class MessageHeader:IMessageHeader { private string from; private string to; [XmlAttribute("From")] string IMessageHeade.FromAddress { get { return this.from;} set { this.from = value;} } [XmlAttribute("To")] string IMessageHeade.ToAddress { get { return this.to;} set { this.to = value;} } }
有没有一种方法可以序列化和反序列化IMessageHeader类型的对象?
尝试时出现以下错误
"无法序列化接口IMessageHeader"
解决方案
回答
我们可以创建实现IMessageHeader的抽象基类,还可以继承MarshalByRefObject
回答
不可以,因为串行器需要一个可以实例化的具体类。
给出以下代码:
XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader)); IMessageHeader header = (IMessageHeader)ser.Deserialize(data);
序列化程序创建哪个类以从Deserialize()返回?
从理论上讲,可以使用XmlSerializer来序列化/反序列化接口。
回答
尝试将IXmlSerializable添加到IMessageHeader声明中,尽管我认为这不起作用。
我记得,.net xml序列化器仅适用于具有默认构造函数的具体类。
回答
问题源于我们不能反序列化接口,而是需要实例化具体类的事实。
XmlInclude属性可用于告诉序列化程序哪些具体类实现了该接口。
回答
我们无法序列化IMessageHeader,因为我们无法执行Activator.CreateInstance(typeof(IMessageHeader)),这是序列化的幕后工作。我们需要一个具体的类型。
我们可以执行typeof(MessageHeader)或者说拥有MessageHeader的实例并执行
XmlSerializer serializer = new XmlSerializer(instance.GetType())