【问题标题】:C# Deserialisation List Count ZeroC#反序列化列表计数为零
【发布时间】:2016-04-12 04:25:10
【问题描述】:

在让我的类正确反序列化时遇到一些问题。

其他反序列化类工作正常,并且在性质上看起来相似,但是当反序列化器运行时,ErrorDetail 和 String 列表的计数均为 0。

我错过了什么/做错了什么?

XML:

<PlaceOrderResponse
    xmlns="http://blah.co.uk">
    <PlaceOrderResult
        xmlns:a="http://blah.co.uk/WebserviceMessage"
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:ErrorDetails
            xmlns:b="http://blah.co.uk/Error">
            <b:ErrorDetail>
                <b:Code>1fasd</b:Code>
                <b:Message>Explain</b:Message>
            </b:ErrorDetail>
        </a:ErrorDetails>
        <a:ID i:nil="true"/>
        <a:InformationalMessages
            xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
            <a:Status>1</a:Status>
        </PlaceOrderResult>
    </PlaceOrderResponse>

C# 类:

[Serializable()]
    [XmlRoot(ElementName = "PlaceOrderResponse", Namespace = "http://blah.co.uk", IsNullable = false)]
    [XmlType(AnonymousType = true, Namespace = "http://blah.co.uk")]
    public class PlaceOrderResponse
    {
        [XmlElement(ElementName = "PlaceOrderResult")]
        public PlaceOrderResult placeOrderResult { get; set; }
    }

    [XmlRoot(ElementName = "PlaceOrderResult")]
    public class PlaceOrderResult : WebserviceMessage { }

[XmlRoot(Namespace = "http://blah.co.uk/WebserviceMessage")]
    [XmlType(AnonymousType = true)]
    public class WebserviceMessage
    {
        [XmlArray("ErrorDetails")]
        [XmlArrayItem("ErrorDetail", typeof(ErrorDetail))]
        public ErrorDetails errorDetails { get; set; }
        [XmlElement("ID")]
        public string ID { get; set; }
        [XmlArray("InformationMessages")]
        [XmlArrayItem(typeof(String))]
        public List<String> InformationMessages { get; set; }
        [XmlElement("Status")]
        public string Status { get; set; }
    }

[XmlRoot(ElementName = "ErrorDetails")]
    [XmlTypeAttribute(AnonymousType = true)]
    public class ErrorDetails : List<ErrorDetail> { }

    [XmlRoot(ElementName = "ErrorDetail", Namespace = "http://blah.co.uk/Error")]
    [XmlTypeAttribute(AnonymousType = true)]
    public class ErrorDetail
    {
        [XmlElement(ElementName = "Code")]
        public string Code { get; set; }
        [XmlElement(ElementName = "Message")]
        public string Message { get; set; }
    }

【问题讨论】:

    标签: c# xml serialization deserialization


    【解决方案1】:

    也许缺少引号来完成这一行中的 url 字符串?

    [XmlType(AnonymousType = true, Namespace = "http://blah.co.uk)]
    

    【讨论】:

    • 谢谢,只是拼写错误,不得不隐藏一些命名空间。
    【解决方案2】:

    除了PlaceOrderResponse 的根元素之外,您的XmlRoot 属性对任何类都没有任何好处。您需要将正确的命名空间添加到您的 XmlArrayItem 属性中。

    例如:

    [XmlArray("ErrorDetails")]
    [XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")]
    public ErrorDetails errorDetails { get; set; }
    

    【讨论】:

      【解决方案3】:

      您的XmlArrayItem 将从其父级继承其命名空间。所以你需要明确地包括这个:

      [XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")].
      

      关于信息性消息,没有要加载的字符串,因此很难判断 XML 应该 是什么样子。它将期望 &lt;string&gt;message&lt;/string&gt;

      形式的元素

      作为提示,调试这些问题的最简单方法是尝试相反的方法 - 创建一个对象并将其序列化为 XML。然后将其与您尝试反序列化的内容进行比较,您会发现很容易发现差异所在。

      【讨论】:

      • 好的,谢谢!我想我曾经有过这种情况,但其他事情搞砸了,当我试图修复时,我只是把它弄得一团糟,在这里发帖,然后让自己更加困惑。
      【解决方案4】:

      我没有亲手完成它,但我只能假设你的课程在某些方面是错误的。使用下面的类和您的 XML,我能够正确反序列化。

      为了简洁起见,我假设您错过了 XML 的标头?

      <?xml version="1.0" encoding="utf-8"?>
      

      我会仔细检查并编辑帖子以防我错了,但您知道在 .NET 4.5 和 Visual Studio 2013 上您可以转到编辑 > 选择性粘贴 > 将 XML 粘贴为类并让 Visual Studio 编写该类为你?这就是我所做的。

      /// <remarks/>
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")]
      [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk", IsNullable = false)]
      public partial class PlaceOrderResponse
      {
      
          private PlaceOrderResponsePlaceOrderResult placeOrderResultField;
      
          /// <remarks/>
          public PlaceOrderResponsePlaceOrderResult PlaceOrderResult
          {
              get
              {
                  return this.placeOrderResultField;
              }
              set
              {
                  this.placeOrderResultField = value;
              }
          }
      }
      
      /// <remarks/>
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")]
      public partial class PlaceOrderResponsePlaceOrderResult
      {
      
          private ErrorDetails errorDetailsField;
      
          private object idField;
      
          private object informationalMessagesField;
      
          private byte statusField;
      
          /// <remarks/>
          [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
          public ErrorDetails ErrorDetails
          {
              get
              {
                  return this.errorDetailsField;
              }
              set
              {
                  this.errorDetailsField = value;
              }
          }
      
          /// <remarks/>
          [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = true)]
          public object ID
          {
              get
              {
                  return this.idField;
              }
              set
              {
                  this.idField = value;
              }
          }
      
          /// <remarks/>
          [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
          public object InformationalMessages
          {
              get
              {
                  return this.informationalMessagesField;
              }
              set
              {
                  this.informationalMessagesField = value;
              }
          }
      
          /// <remarks/>
          [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")]
          public byte Status
          {
              get
              {
                  return this.statusField;
              }
              set
              {
                  this.statusField = value;
              }
          }
      }
      
      /// <remarks/>
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/WebserviceMessage")]
      [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = false)]
      public partial class ErrorDetails
      {
      
          private ErrorDetail errorDetailField;
      
          /// <remarks/>
          [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/Error")]
          public ErrorDetail ErrorDetail
          {
              get
              {
                  return this.errorDetailField;
              }
              set
              {
                  this.errorDetailField = value;
              }
          }
      }
      
      /// <remarks/>
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/Error")]
      [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/Error", IsNullable = false)]
      public partial class ErrorDetail
      {
      
          private string codeField;
      
          private string messageField;
      
          /// <remarks/>
          public string Code
          {
              get
              {
                  return this.codeField;
              }
              set
              {
                  this.codeField = value;
              }
          }
      
          /// <remarks/>
          public string Message
          {
              get
              {
                  return this.messageField;
              }
              set
              {
                  this.messageField = value;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多