2012-02-09 13 views
-1

XMLファイルをオブジェクトに逆シリアル化する必要があります。 XMLの内容:XMLの逆シリアル化が機能しない

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

私はオブジェクトクラスを定義します。

[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; } 
} 

しかし、直列化復元は動作しません:プレイヤー配列が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にあるデータと一致するデータでオブジェクトを作成します。次に、シリアル化して、デシリアライズしたいデータと同じ出力にします。

このようにして、プロパティに適用できる使用可能な属性の効果を実際に確認することができます。

同じものをシリアル化する場合は、逆シリアル化することもできます。

関連する問題