【问题标题】:XMLSerialization in C#C# 中的 XML 序列化
【发布时间】:2010-09-08 18:25:36
【问题描述】:
我有一个显式实现接口的简单类型。
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”
【问题讨论】:
标签:
c#
.net
serialization
interface
【解决方案1】:
你不能序列化 IMessageHeader 因为你不能做 Activator.CreateInstance(typeof(IMessageHeader)) 这是序列化在幕后要做的事情。你需要一个具体的类型。
你可以做 typeof(MessageHeader) 或者你可以说,有一个 MessageHeader 的实例然后做
XmlSerializer serializer = new XmlSerializer(instance.GetType())
【解决方案2】:
不,因为序列化程序需要一个可以实例化的具体类。
给定以下代码:
XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));
IMessageHeader header = (IMessageHeader)ser.Deserialize(data);
序列化器创建什么类以从 Deserialize() 返回?
理论上可以序列化/反序列化接口,只是不能使用 XmlSerializer。
【解决方案3】:
尝试将 IXmlSerializable 添加到您的 IMessageHeader 声明中,尽管我认为这不会奏效。
据我回忆,.net xml 序列化程序仅适用于具有默认构造函数的具体类。
【解决方案4】:
问题源于您无法反序列化接口但需要实例化具体类。
XmlInclude 属性可用于告诉序列化器哪些具体类实现了接口。
【解决方案5】:
您可以创建一个抽象基类,实现 IMessageHeader 并继承 MarshalByRefObject