【问题标题】: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

            【讨论】:

              猜你喜欢
              • 2010-11-25
              • 2011-06-17
              • 2011-05-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多