2012-01-11 1 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; } 
} 

각 부분을 deserialize 할 수 있습니다. 그게 내가 할 수있다 :

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

그리고 priceEntity 올바르게 List<Interval> Intervals 포함 stringReader에 포함 된 XML 데이터로 초기화됩니다. 그러나 TestPrice 인스턴스를 deserialize하려고하면 항상 빈 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에 이미 가지고있는 serializer 대신에 새로운 XmlReader 인스턴스를 serializer에 전달하고 있습니까? – Cesar

+0

@ Cesar, 죄송합니다. 독자와의 실수였습니다. 샘플을 수정했습니다. 이제는 효과가있다. –

+0

재밌 네요, 똑같은 코드를 실행하면 작동합니다. 그러나 실제 코드에 적용하면 여전히 동일한 결과를 얻습니다. 어쨌든 적어도 작동해야한다는 것을 알기 때문에 받아 들인 것으로 표시하고 있습니다. 감사! – Cesar