C# 中的 XML 序列化
-
09-06-2019 - |
题
我有一个显式实现接口的简单类型。
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,因为您无法执行 Activator.CreateInstance(typeof(IMessageHeader)) 这就是序列化将在幕后执行的操作。你需要一个具体的类型。
您可以执行 typeof(MessageHeader) 或者您可以说,拥有 MessageHeader 的实例并执行
XmlSerializer serializer = new XmlSerializer(instance.GetType())
其他提示
不,因为序列化器需要一个可以实例化的具体类。
给出以下代码:
XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));
IMessageHeader header = (IMessageHeader)ser.Deserialize(data);
序列化器创建什么类来从 Deserialize() 返回?
理论上,可以序列化/反序列化接口,但不能使用 XmlSerializer。
尝试将 IXmlSerialized 添加到您的 IMessageHeader 声明中,尽管我认为这不会起作用。
据我所知,.net xml 序列化器仅适用于具有默认构造函数的具体类。
该问题源于以下事实:您无法反序列化接口,但需要实例化具体类。
XmlInclude 属性可用于告诉序列化器哪些具体类实现该接口。
您可以创建一个实现 IMessageHeader 并继承 MarshalByRefObject 的抽象基类
不隶属于 StackOverflow