2

这是反序列化的代码:

XmlRootAttribute xRoot = new System.Xml.Serialization.XmlRootAttribute();
xRoot.ElementName = "myList";
xRoot.IsNullable = true;
xRoot.Namespace = "http://schemas.datacontract.org/2006/05/Blah.Blah.Blah";
XmlSerializer serializer = new XmlSerializer(typeof(myList), xRoot);
XmlReader reader = new System.Xml.XmlTextReader(url);
myList myDeserializedList = (myList)serializer.Deserialize(reader);
reader.Close();

而且 myDeserializedList 是空的,尽管当我转到 URL 时,我看到了一个相当大的 XML。

这是我的课程:

[Serializable()]
public class myItem
{
    [System.Xml.Serialization.XmlElement("Key")]
    public long Key { get; set; }
    [System.Xml.Serialization.XmlElement("Discount")]
    public double Discount { get; set; }
}


[Serializable, System.Xml.Serialization.XmlRoot("myList")]
public class myList
{
    [System.Xml.Serialization.XmlArray("myList")]
    [System.Xml.Serialization.XmlArrayItem("myItem", typeof(myItem))]
    public List<myItem> myItem { get; set; }
}

这是xml:

<myList xmlns="http://schemas.datacontract.org/2006/05/Blah.Blah.Blah" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <myItem>
        <Key>3465</Key>
        <Discount>0.00000000</Discount>
    </myItem>
</myList>
4

1 回答 1

5

您的代码正在尝试读取/写入如下所示的 XML:

<myList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.datacontract.org/2006/05/Blah.Blah.Blah">
  <myList>
    <myItem>
      <Key>3465</Key>
      <Discount>0.00000000</Discount>
    </myItem>
  </myList>
</myList>

注意myList包装集合的第二个标签。

您需要做的就是放弃XmlArrayandXmlArrayItem属性,而是使用XmlElement. 这将指示将XmlSerializer项目集合放置在行内,而不是嵌套在另一个元素中。

[Serializable, System.Xml.Serialization.XmlRoot("myList")]
public class myList
{
    [XmlElement]
    public List<myItem> myItem { get; set; }
}

编辑:另外,您不需要使用大多数属性;XmlSerializer 在应用默认值方面做得很好,重新声明它们变得有点多余,所以你可以有:

public class myItem
{
    public long Key { get; set; }
    public double Discount { get; set; }
}

public class myList
{
    [XmlElement]
    public List<myItem> myItem { get; set; }
}

甚至放弃这xRoot.ElementName = "myList";条线,它仍然会产生完全相同的 XML。如果您想让它非常明确地说明您的期望,或者如果您希望您可以在不更改 XML 的情况下更改您的属性/类标识符,请随意保留它。

于 2013-01-04T16:25:42.343 回答