【问题标题】:Deserializing XML to Custom Nested Classes in .net Service将 XML 反序列化为 .net 服务中的自定义嵌套类
【发布时间】:2016-05-11 01:58:02
【问题描述】:

我在从 SQL Server 反序列化 XML 时遇到问题。 XML 很好;反序列化它的代码是已知的工作代码;但由于某种原因,它只是反序列化了第一级和第二级,这意味着该类与 XML 不匹配,但是在盯着它之后我无法识别它。

这是 XML 的摘录:

    <Options>
         <Countries>
             <Country ID="1" Name="Afghanistan" Code="AF" ISO="4" SubDivision="City" PostalName="Postal Code" />
             <Country ID="2" Name="Albania" Code="AL" ISO="8" SubDivision="City" PostalName="Postal Code" />
             <Country ID="3" Name="Algeria" Code="DZ" ISO="12" SubDivision="City" PostalName="Postal Code" />
             <Country ID="4" Name="American Samoa" Code="AS" ISO="16" SubDivision="City" PostalName="Postal Code" />
             <Country ID="5" Name="Andorra" Code="AD" ISO="20" SubDivision="City" PostalName="Postal Code" />
         </Countries>
         <EntityTypes>
             <EntityType ID="4" Name="Individual" />
             <EntityType ID="5" Name="Business" />
         </EntityTypes>
     </Options>

这是Options 类:

    namespace RecoverItWCF.Classes
    {
        [DataContract]
        [Serializable()]
        public class Options
        {
            [DataMember(Name = "Categories", IsRequired = false)]
            [XmlElement("Categories")]
            public Category[] Categories;
            [DataMember(Name = "Countries", IsRequired = false)]
            [XmlElement("Countries")]
            public Country[] Countries;
            [DataMember(Name = "EntityTypes", IsRequired = false)]
            [XmlElement("EntityTypes")]
            public EntityType[] EntityTypes;
        }
    }

这是Country 类:

namespace RecoverItWCF.Classes
{
    [DataContract]
    [Serializable()]
    public class Country
    {
        [DataMember(Name = "ID", IsRequired = true)]
        [XmlAttribute("ID")]
        public string ID { get; set; }

        [DataMember(Name = "Name", IsRequired = true)]
        [XmlAttribute("Name")]
        public string Name { get; set; }

        // truncated for brevity
     }
 }

这是EntityType 类:

namespace RecoverItWCF.Classes
    {
    [DataContract]
    [Serializable()]
    public class EntityType
        {
        [DataMember(Name = "ID")]
        [XmlAttribute("ID")]
        public Int16 ID { get; set; }

        [DataMember(Name = "Name")]
        [XmlAttribute("Name")]
        public string Name { get; set; }
    }
 }

Options 元素不包含Categories 元素(正确),但确实包含Countries 元素(正确),但Countries 级别下面没有任何内容(没有Country 数组)在断点处突出显示,它应该有 200 个Country 元素。它还包含一个EntityTypes 元素,但它下面没有任何内容。

【问题讨论】:

    标签: c# .net web-services wcf deserialization


    【解决方案1】:

    您应该使用[XmlArrayItem] 属性:

    [XmlArrayItem("Countries", IsNullable=true, Type = typeof(Country))]
    public Country[] Countries;
    

    【讨论】:

    • 谢谢,但是没有用。我修改了 Options 类。问题似乎出在 Country 和 EntityType 类中。我得到了一个父级(国家),但 ID 和名称在国家一级和只有一个国家的空值。
    【解决方案2】:

    感谢@Xiaoy312 带领我走上正确的道路。需要对 Options 类进行更正。这样就完成了工作。

        [DataMember(Name = "Countries", IsRequired = false)]
        [XmlArray("Countries")]
        [XmlArrayItem("Country")]
        public List<Country> Countries { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2011-11-03
      • 2023-01-28
      • 2012-11-18
      • 2014-09-23
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多