2012-01-11 4 views
2

私は次のXML文書デシリアライズしようとしています:空のコレクションでXMLSERIALIZE結果とコレクションをデシリアライズ

<?xml version="1.0" encoding="utf-8" ?> 
<TestPrice> 
    <Price> 
    <A>A</A> 
    <B>B</B> 
    <C>C</C>  
    <Intervals> 
     <Interval> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
     </Interval> 
     <Interval> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
     </Interval> 
    </Intervals> 
    </Price> 
</TestPrice> 

をそして、私は三つのクラスは、オブジェクトグラフにこれをデシリアライズするために定義されています:

public class TestPrice 
{ 
    private List<Price> _prices = new List<Price>(); 
    public List<Price> Price 
    { 
     get { return _prices; } 
     set { _prices = value; } 
    } 
} 

public class Price 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 

    private List<Interval> _intervals = new List<Interval>(); 
    public List<Interval> Intervals 
    { 
     get { return _intervals; } 
     set { _intervals = value; } 
    } 
} 

public class Interval 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 
} 

私は各部分をデシリアライズすることができます。それは私が行うことができ、次のとおりです。

var serializer = new XmlSerializer(typeof(Price)); 
var priceEntity = ((Price)(serializer.Deserialize(XmlReader.Create(stringReader)))); 

そしてpriceEntityが正しくList<Interval> Intervals含むstringReader、中に含まれているXMLデータで初期化されます。しかし、TestPriceインスタンスを逆シリアル化しようとすると、常に空のList<Price> Priceが出現します。

私はこのようなTestPriceの定義変更した場合:

public class TestPrice 
{ 
    public Price Price { get; set; } 
} 

をそれは動作します。もちろん、私のXSDはPriceをシーケンスと定義しています。デシリアライズしている他のエンティティもありますが、ルート要素にはシーケンスは含まれていません。私が気付いていない限界がありますか? TestPriceに何らかのメタデータを含める必要がありますか?

答えて

3

ちょうど[XmlElement]であなたの価格のコレクションを飾る:

[XmlElement(ElementName = "Price")] 
public List<Price> Price 
{ 
    get { return _prices; } 
    set { _prices = value; } 
} 

はまた、あなたはあなたのXMLのルートタグがTestPriceであるのに対し、Priceをデシリアライズしているようです。だから、完全な例がここにあります:

public class TestPrice 
{ 
    [XmlElement(ElementName = "Price")] 
    public List<Price> Price { get; set; } 
} 

public class Price 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 

    public List<Interval> Intervals { get; set; } 
} 

public class Interval 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<TestPrice> 
    <Price> 
    <A>A</A> 
    <B>B</B> 
    <C>C</C> 
    <Intervals> 
     <Interval> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
     </Interval> 
     <Interval> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
     </Interval> 
    </Intervals> 
    </Price> 
</TestPrice>"; 

     var serializer = new XmlSerializer(typeof(TestPrice)); 
     using (var reader = new StringReader(xml)) 
     using (var xmlReader = XmlReader.Create(reader)) 
     { 
      var priceEntity = (TestPrice)serializer.Deserialize(xmlReader); 
      foreach (var price in priceEntity.Price) 
      { 
       // do something with the price 
      } 
     } 
    } 
} 
+0

私はあなたの例として提案されたように価格コレクションを飾りました。それでも私は空のプライスコレクションを取り戻す。ところで、なぜあなたはxmlReaderに既に持っているものではなく、新しいXmlReaderインスタンスをシリアライザに渡していますか? – Cesar

+0

@Cesar、申し訳ありませんが、それは読者の間違いでした。私は私のサンプルを修正しました。今はうまくいくはずです。 –

+0

おかしい、私はあなたの全く同じコードを実行し、それは動作します。しかし、それを私の実際のコードに適用すると、私は同じ結果を得ます。とにかく、少なくとも私はそれがうまくいくはずだから、私はそれを受け入れたものとしてマークしています。ありがとう! – Cesar

関連する問題