2012-01-11 42 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正确地包含在stringReader XML数据,包括List<Interval> Intervals初始化。但是,如果我试图反序列化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; } 
} 

而且你似乎是反序列化Price,而在你的XML根标签是TestPrice。所以,这里是一个完整的例子:

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 2012-01-11 21:59:06

+0

@塞萨尔,对不起,这是读者的错误。我已经修复了我的示例。它现在应该工作。 – 2012-01-11 22:00:08

+0

有趣,我运行你完全相同的代码,它的工作原理。但是如果我将它适应于我的实际代码,我仍然会得到相同的结果。无论如何,至少我知道它应该起作用,所以我将其标记为已接受。谢谢! – Cesar 2012-01-11 22:14:22