C#中的XML序列化

时间:2008-09-12 21:16:27

标签: c# .net serialization interface

我有一个明确实现接口的简单类型。

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”

5 个答案:

答案 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