2012-02-09 2 views
-1

XML 파일을 객체로 비 순차화해야합니다. 은 XML 내용 :XML 비 직렬화가 작동하지 않습니다.

[Serializable()] 
[XmlRoot("Players")] 
public class Players 
{ 
    [XmlAttribute("dealerId")] 
    public int DealerId { get; set; } 
    [XmlArrayItem("Player", typeof(Player))] 
    public Player[] Players { get; set; } 
} 

[Serializable()] 
[XmlRoot("Player")] 
public class Player 
{ 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
    [XmlElement("ScreenName")] 
    public string ScreenName { get; set; } 
} 

그러나, 직렬화 복원이 작동하지 않습니다 :

<Players dealerId="2"> 
    <Player id="1"> 
     <ScreenName>JetYeo</ScreenName> 
    </Player> 
    <Player id="2"> 
     <ScreenName>Test</ScreenName> 
    </Player> 
    </Players> 

나는 객체 클래스를 정의 플레이어 배열이 null입니다. 그것을 해결하도록 도와주세요. 감사.

답변

3

특성이 잘못되어 실패합니다. 차이점은 XmlArrayItem이 2 레벨 관계 (<Players><Players><Player .../>...</Players></Players>)를 기대한다는 것입니다. 따라서 Players 것이되어야합니다 :

[XmlElement("Player")] 
public Player[] Players { get; set; } 

개인적으로하지만, 내가 선호하는 것 :

private readonly List<Player> players = new List<Player>(); 
[XmlElement("Player")] 
public List<Player> Players { get { return players; } } 

(즉 어떤 set, 대신 배열의 목록)을 게으르게도

또는 - 인스턴스 :

private List<Player> players; 
[XmlElement("Player")] 
public List<Player> Players { 
    get { return players ?? (players = new List<Player>()); } 
} 
+0

유형의 이름이 동일하므로 목록의 이름을 'Players'로 지정할 수 없습니다. – alexn

+0

@alexn 잘 찾아 냈습니다 - 그래도 질문에서 가져 왔습니다. –

+0

그냥 알아 차 렸습니다 :) – alexn

4

이러한 종류의 문제는 실제로 직렬화 논리를 역전시키는 것입니다. XML에있는 데이터와 일치하는 데이터로 개체를 만듭니다. 그런 다음 출력을 직렬화하려는 데이터와 동일하게 직렬화하십시오.

이렇게하면 속성에 적용 할 수있는 사용 가능한 특성의 효과를 실제로 '볼 수 있습니다.

같은 것을 직렬화하면 역 직렬화 할 수도 있습니다.

관련 문제