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コレクションをラップしている2番目のタグに注意してください。

あなたがする必要があるのは、属性と属性を捨ててXmlArrayXmlArrayItem代わりにを使用すること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 に答える