【问题标题】:C# XML deserializationC# XML 反序列化
【发布时间】:2016-05-14 16:33:37
【问题描述】:

我有一个带有不同类型对象数组的 xml。当它到达关键字结构时,我遇到了 xmlchoiceidentifier 的问题。当它反序列化它时,它只是返回 null。

这是我要反序列化的 xml:

<struct>
   <member>
      <name>result</name>
      <value><boolean>1</boolean></value>
   </member>
   <member>
      <name>user_info</name>
      <value>
         <struct>
            <member>
               <name>First Name</name>
               <value><string>John</string></value>
            </member>
            <member>
               <name>Last Name</name>
               <value><string>Smith</string></value>
            </member>
         </struct>
      </value>
   </member>
</struct>

这是我用于反序列化的代码:

public class ResponseStruct
{
    [XmlArray("struct"), XmlArrayItem("member")]
    public List<ResponseMember> Struct { get; set; }
}

public class ResponseArray
{
    [XmlArray("array"), XmlArrayItem("data")]
    public List<ResponseMemberValue> Array { get; set; }
}

public class ResponseMember
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("value")]
    public ResponseMemberValue Value { get; set; }
}

public class ResponseMemberValue
{
    [XmlChoiceIdentifier("ValueChoice"), XmlElement("boolean", typeof(bool)), XmlElement("int", typeof(int)), XmlElement("string", typeof(string)), XmlElement("datetime", typeof(DateTime)), XmlElement("double", typeof(double)), XmlElement("base64", typeof(string)), XmlElement("array", typeof(ResponseArray)), XmlElement("struct", typeof(ResponseStruct))]
    public object Value { get; set; }

    [XmlIgnore]
    public virtual ValueType ValueChoice { get; set; }

    public enum ValueType
    {
        @string,
        @int,
        @datetime,
        @double,
        base64,
        array,
        boolean,
        @struct
    }
}

【问题讨论】:

  • 复制你的xml,在你的VS菜单中,选择Edit / Paste Special / Paste XML as Classes,

标签: c# xml serialization xmlserializer


【解决方案1】:

您的主要问题是您为public List&lt;ResponseMember&gt; Struct { get; set; } 指定了[XmlArray("struct"), XmlArrayItem("member")]。这意味着该集合的 XML 应该有一个名为 &lt;struct&gt; 的外包装元素。但是,外部&lt;struct&gt; 元素由包含ResponseMemberValue.Value 属性的XmlElement("struct", typeof(ResponseStruct)) 属性指定 - 但您的XML 只有一层&lt;struct&gt; 元素。因此,您需要通过使用[XmlElement("member")] 来指定此集合 是否具有外部容器元素。而且,虽然您的 XML 不包含 &lt;array&gt; 元素的示例,但我怀疑您也应该对 ResponseArray 执行相同的操作。

接下来,您需要使用[XmlRoot][XmlType] 指定根元素名称。如果使用后者,它将自动用作多态Value 元素中的元素名称。

因此:

[XmlType("struct")]
public class ResponseStruct
{
    [XmlElement("member")]
    public List<ResponseMember> Struct { get; set; }
}

[XmlType("array")]
public class ResponseArray
{
    [XmlElement("data")]
    public List<ResponseMemberValue> Array { get; set; }
}

public class ResponseMember
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("value")]
    public ResponseMemberValue Value { get; set; }
}

public class ResponseMemberValue
{
    [XmlChoiceIdentifier("ValueChoice")]
    [XmlElement("boolean", typeof(bool)), 
    XmlElement("int", typeof(int)), 
    XmlElement("string", typeof(string)), 
    XmlElement("datetime", typeof(DateTime)), 
    XmlElement("double", typeof(double)), 
    XmlElement("base64", typeof(string)), 
    XmlElement(typeof(ResponseArray)), 
    XmlElement(typeof(ResponseStruct))]
    public object Value { get; set; }

    [XmlIgnore]
    public virtual ValueType ValueChoice { get; set; }

    public enum ValueType
    {
        @string,
        @int,
        @datetime,
        @double,
        base64,
        array,
        boolean,
        @struct
    }
}

原型fiddle.

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2012-09-08
    • 1970-01-01
    • 2012-02-02
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多