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())