繁体   English   中英

如何反序列化从 xml 到 c# object 的嵌套数组?

[英]How to deserialize a nested Array from xml to c# object?

I'm trying deserialize the following soap xml response from my web service to a C# object:

    <?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <ns2:ExportPositionsQueryResponse xmlns:ns2="http://ns" xmlns:ns3="http://nscpm/datatypes/schema/v2011_06_01" xmlns="http://nscpmexportvalue/schema/v2011_06_01">
      <ns2:Positions>
        <FieldTypes>
          <FieldType ExtId="PF_NAME" Type="string"></FieldType>
          <FieldType ExtId="POSITION_QUANTITY" Type="double"></FieldType>
          <FieldType ExtId="INST_NAME" Type="string"></FieldType>
          <FieldType ExtId="INST_TYPE" Type="string"></FieldType>
          <FieldType ExtId="POSITION_TYPE" Type="string"></FieldType>
          <FieldType ExtId="POSITION_CLASS" Type="string"></FieldType>
        </FieldTypes>
        <Position>
          <Field ExtId="INST_NAME" Value="name"></Field>
          <Field ExtId="INST_TYPE" Value="asd"></Field>
          <Field ExtId="PF_NAME" Value="ads"></Field>
          <Field ExtId="POSITION_CLASS" Value="asd"></Field>
          <Field ExtId="POSITION_TYPE" Value="asd"></Field>
          <Field ExtId="POSITION_QUANTITY" Value="asd"></Field>
        </Position>
        <Position>
          <Field ExtId="INST_NAME" Value="asd"></Field>
          <Field ExtId="INST_TYPE" Value="asd"></Field>
          <Field ExtId="PF_NAME" Value="asd"></Field>
          <Field ExtId="POSITION_CLASS" Value="ads"></Field>
          <Field ExtId="POSITION_TYPE" Value="NORMAL"></Field>
          <Field ExtId="POSITION_QUANTITY" Value="asd"></Field>
        </Position>
        <Position>
</ns2:Positions>
    </ns2:ExportPositionsQueryResponse>
  </soap:Body>
</soap:Envelope>

反序列化后, xmlSerializer仅使用元素FieldTypes和 Position 的最后一个元素Position 我认为XmlSerializer嵌套Array(PositionField[][] Position)存在问题,无法反序列化所有Position数组元素。 这是我用于反序列化的C# object class 的一部分:

    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns")]
    public partial class ExportPositionsQueryResponsePositions
    {
        private FieldTypesFieldType[] fieldTypesField;

        private PositionField[][] positionField;

        [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://ns")]
        [System.Xml.Serialization.XmlArrayItemAttribute("FieldType", IsNullable = false)]
        public FieldTypesFieldType[] FieldTypes
        {
            get
            {
                return this.fieldTypesField;
            }
            set
            {
                this.fieldTypesField = value;
            }
        }
        [System.Xml.Serialization.XmlArray(ElementName ="Position",Namespace = "http://ns")]
        [System.Xml.Serialization.XmlArrayItem("Field", typeof(PositionField[]), IsNullable = false)]
        public PositionField[][] Position
        {
            get
            {
                return this.positionField;
            }
            set
            {
                this.positionField = value;
            }
        }
    }

为了创建这个 class,我使用了 Visual Studio 的“Paste special”function。 但是使用svcutil工具我也遇到了同样的问题。

我已经解决了这个问题。 我应该编辑自动生成的代理客户端 class。 我已经用List<T>替换了所有nested arrays [][]并且序列化再次起作用。 这是示例:

错误生成的部分代码:

private PositionField[][] positionField;

public PositionField[][] Position
    {
        get
        {
            return this.positionField;
        }
        set
        {
            this.positionField = value;
        }
    }

编辑部分代码:

 private List<PositionField> positionField;

 public List<PositionField> Position
    {
        get
        {
            return this.positionField;
        }
        set
        {
            this.positionField = value;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM