我有一个明确实现接口的简单类型。
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”
答案 0 :(得分:3)
您无法序列化IMessageHeader,因为您无法执行Activator.CreateInstance(typeof(IMessageHeader)),这是序列化将要执行的操作。你需要一个具体的类型。
你可以做typeof(MessageHeader)或者你可以说,有一个MessageHeader实例并且做
XmlSerializer serializer = new XmlSerializer(instance.GetType())
答案 1 :(得分:0)
不,因为序列化程序需要一个可以实例化的具体类。
给出以下代码:
XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));
IMessageHeader header = (IMessageHeader)ser.Deserialize(data);
序列化程序创建什么类来从Deserialize()返回?
从理论上讲,可以对接口进行序列化/反序列化,而不是使用XmlSerializer。
答案 2 :(得分:0)
尝试将IXmlSerializable添加到IMessageHeader声明中,尽管我认为这不起作用。
根据我的记忆,.net xml序列化程序仅适用于具有默认构造函数的具体类。
答案 3 :(得分:0)
问题源于您无法反序列化接口但需要实例化具体类。
XmlInclude属性可用于告诉序列化程序哪些具体类实现了接口。
答案 4 :(得分:-1)
您可以创建一个抽象基类,实现IMessageHeader并继承MarshalByRefObject