【问题标题】:XML Deserialization doesn't work with abstract classXML 反序列化不适用于抽象类
【发布时间】:2016-04-08 15:44:04
【问题描述】:

我正在尝试将 xml 字符串反序列化为对象。但我的对象始终为空。

我有一个抽象类(Response),一个继承自“Response”的类(DirectorSearchResponse),以及一个“DirectorSearchResponse”类中的对象(HeaderResponse)。该对象在反序列化后始终为空。

响应.cs

public abstract class Response
{
    public HeaderResponse Header { get; set; }

    public Response()
    {
    }
}

DirectorSearchResponse.cs

[XmlRoot("xmlresponse")]
public class DirectorSearchResponse : Response
{
    public DirectorSearchResponse() : base()
    {
        /* DO NOTHING */
    }
}

HeaderResponse.cs

[XmlRoot("header")]
public class HeaderResponse
{
    [XmlElement("toto")]
    public String toto { get; set; }

    public HeaderResponse()
    {

    }
}

我的运行代码:

        /* DESERIALIZE */
        String toto = "<xmlresponse><header><toto>tutu</toto><reportinformation><time>08/04/2016 13:33:37</time><reporttype> Error</reporttype><country>FR</country><version>1.0</version><provider>www.creditsafe.fr</provider><chargereference></chargereference></reportinformation></header><body><errors><errordetail><code>110</code><desc></desc></errordetail></errors></body></xmlresponse>";
        XmlSerializer xsOut = new XmlSerializer(typeof(DirectorSearchResponse));
        using (TextReader srr = new StringReader(toto))
        {
            DirectorSearchResponse titi = (DirectorSearchResponse)xsOut.Deserialize(srr);
        }

当我执行我的代码时,对象“titi”是实例化的,但“Header”始终为空。

如何从 xml 中检索“toto”值?

【问题讨论】:

    标签: c# xml deserialization xmlserializer


    【解决方案1】:

    XML 区分大小写,因此您需要使用[XmlElement("header")] 通知序列化程序Header 属性的正确元素名称:

    public abstract class Response
    {
        [XmlElement("header")]
        public HeaderResponse Header { get; set; }
    
        public Response()
        {
        }
    }
    

    您对HeaderResponse 应用的[XmlRoot("header")] 仅在它是XML 文档的根元素时控制其元素名称。

    【讨论】:

      【解决方案2】:

      您需要像这样将链接添加到抽象类:

      [XmlRoot(ElementName = "Response")]
      public abstract class Response
      {
           public HeaderResponse Header { get; set; }
      
          public Response()
          {
          }
      }
      
      [XmlRoot(ElementName = "Response")]
      public class DirectorSearchResponse : Response
      {
          public DirectorSearchResponse() : base()
         {
          /* DO NOTHING */
         }
      } 
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 2017-11-06
      • 2016-01-04
      • 2012-11-18
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多