【问题标题】:Not able to deserialize xml into generic list无法将 xml 反序列化为通用列表
【发布时间】:2016-01-18 07:28:54
【问题描述】:

我有以下 C# 类

[XmlTypeAttribute(AnonymousType = true)]
public class TransactionTypesHolder
{
    [XmlArrayItem("TransactionType", typeof(TransactionType))]
    public List<TransactionType> TransactionTypes { get; set; }

    public TransactionTypesHolder()
    {
        TransactionTypes = new List<TransactionType>();
    }
}


public class TransactionType
{
    [XmlElement("Mti")]
    public string Mti { get; set; }

    [XmlElement("Description")]
    public string Description { get; set; }

    //[XmlArrayItem("Field", typeof(Field))]
    //public List<Field> Fields { get; set; }

    [XmlArray(ElementName = "Fields")]
    [XmlArrayItem("Field", typeof(Field))]
    public List<Field> Fields { get; set; }

}

[Serializable]
public class Field
{
    [XmlElement("FieldNumber")]
    public string FieldNumber { get; set; }

    [XmlElement("Description")]
    public string Description { get; set; }

    //[XmlArrayItem("FieldPart", typeof(FieldPart))]
    //public List<FieldPart> FieldParts { get; set; }

    [XmlArray(ElementName = "FieldParts")]
    [XmlArrayItem("FieldPart", typeof(FieldPart))]
    public List<FieldPart> FieldParts { get; set; }
}

[Serializable]
public class FieldPart
{
    [XmlElement("PartNumber")]
    public string PartNumber { get; set; }

    [XmlElement("PartValue")]
    public string PartValue { get; set; }
}

我正在尝试通过以下代码反序列化

try
            {
                XmlSerializer serializer = new
                    XmlSerializer(typeof(TransactionTypesHolder));

                // A FileStream is needed to read the XML document.
                FileStream fs = new FileStream("Xmlfile1.xml", FileMode.Open);
                XmlReader reader = XmlReader.Create(fs);

                // Declare an object variable of the type to be deserialized.
                TransactionTypesHolder i;

                // Use the Deserialize method to restore the object's state.
                i = (TransactionTypesHolder)serializer.Deserialize(reader);
                fs.Close();

            }
            catch (Exception ex)
            {


            }

但没想到会出错。

我的xml是

<?xml version="1.0" ?>
<TransactionTypes>
  <TransactionType>
    <Mti>200</Mti>
    <Description>Debit</Description>
    <Fields>
      <Field>
        <FieldNumber>3</FieldNumber>
        <Description></Description>
        <FieldParts>
          <FieldPart>
            <PartNumber>
              1
            </PartNumber>
            <PartValue>
              00
            </PartValue>
            <Description></Description>
          </FieldPart>
          <FieldPart>
            <PartNumber>
              2
            </PartNumber>
            <PartValue>
              00
            </PartValue>
            <Description></Description>
          </FieldPart>
        </FieldParts>
      </Field>
      <Field>
        <FieldNumber>14</FieldNumber>
        <Description></Description>
        <FieldParts>
          <FieldPart>
            <PartNumber>
              1
            </PartNumber>
            <PartValue>
              9911
            </PartValue>
            <Description></Description>
          </FieldPart>
        </FieldParts>
      </Field>
    </Fields>
  </TransactionType>
  <TransactionType>
    <Mti>100</Mti>
    <Description>Balance</Description>
    <Fields>
      <Field>
        <FieldNumber>3</FieldNumber>
        <Description></Description>
        <FieldParts>
          <FieldPart>
            <PartNumber>
              1
            </PartNumber>
            <PartValue>
              31
            </PartValue>
            <Description></Description>
          </FieldPart>
          <FieldPart>
            <PartNumber>
              2
            </PartNumber>
            <PartValue>
              00
            </PartValue>
            <Description></Description>
          </FieldPart>         
      </Field>
      <Field>
        <FieldNumber>14</FieldNumber>
        <Description></Description>
        <FieldParts>
          <FieldPart>
            <PartNumber>
              1
            </PartNumber>
            <PartValue>
              9911
            </PartValue>
            <Description></Description>
          </FieldPart>
        </FieldParts>
      </Field>
    </Fields>
  </TransactionType>  
</TransactionTypes>

【问题讨论】:

    标签: .net xml c#-4.0 xmlserializer


    【解决方案1】:

    这看起来不对:

        [XmlElement("TransactionTypes")]
        public List<TransactionType> TransactionTypes { get; set; }
    

    尝试更改为:

        [XmlArray(ElementName="TransactionTypes")]
        [XmlArrayItem("TransactionType", typeof(TransactionType))]
        public List<TransactionType> TransactionTypes { get; set; }
    

    也改变:

        [XmlArrayItem("Field", typeof(Field))]
        public List<Field> Fields { get; set; }
    

    到:

        [XmlArray(ElementName="Fields")]
        [XmlArrayItem("Field", typeof(Field))]
        public List<Field> Fields { get; set; }
    

    同样适用于:

        [XmlArrayItem("FieldPart", typeof(FieldPart))]
        public List<FieldPart> FieldParts { get; set; }
    

    到:

        [XmlArray(ElementName="FieldParts")]
        [XmlArrayItem("FieldPart", typeof(FieldPart))]
        public List<FieldPart> FieldParts { get; set; }
    

    【讨论】:

    • 我已经相应地改变了它,但是得到了同样的错误 is not expected.
    • 更改 Fields 和 FieldParts 的属性后无效。事实上,我已经成功地将单个 TransactionType xml 条目反序列化为 TransactionType 对象。问题仅在于列表填充
    【解决方案2】:

    我用过以下课程

     [XmlRoot("TransactionTypes")]
        public class TransactionTypes
        {
            [XmlElement("TransactionType")]
            public List<TransactionType> TransactionType { get; set; }
        }
    

    而不是 TransactionTypesHolder 并成功地能够反序列化 xml

    【讨论】:

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