2009-06-11 22 views
1

私はXNA 3でゲームを構築しており、レベルはXML形式で保存されています。これらのXMLファイルをレベルオブジェクトにデシリアライズするにはどのようなソリューションをお勧めしますか?それはXboxで動作する必要があります。XML XNAオブジェクトの逆シリアル化

答えて

1

実際のレベルをシリアライズすることをお勧めしません。そこからレベルオブジェクトを構築するための情報を含む単純なコンテナクラスを作成するだけです。これはいい、きれいなXMLになります

[Serializable()] 
public class LevelDefinition 
{ 
    public Vector3 PlayerStartPosition { get; set; } 
    public string LevelName { get; set; } 
    public List<Enemy> Enemies { get; set; } 

    ... etc 
} 

:よう

何か。

そして、XmlSerializerクラスを使用して逆シリアル化してください。

+0

私はそれに行きます。良いアイデア! – RCIX

+0

私は時には、時々物事、特にコレクションをシリアライズするときにいくつかの問題を抱えてきました。これが起こった場合は、バイナリのシリアル化にマークすることができます – jasonh

2

私は360で試したわけではありませんが、XmlSerializerはオブジェクトグラフをXMLに保存/ロードする簡単な方法です。基本的には、xmlファイルを取り出してxsd.exeを実行します。これは、あなたのXMLを非直列化できるC#クラスのセットを生成します。あなたのコードでは、次のようなコードを書くでしょう:

var serializer = new XmlSerializer(typeof(LevelType)); 
var level = (LevelType)serializer.Deserialize(streamToYourLevel); 

すべてが完了しました。

+0

これは機能する可能性があります。私はチャンスがあるときにそれを試してみるでしょう。ありがとう! – RCIX

1

私はバイナリシリアル化がZuneとXBoxでは利用可能だとは思っていませんが、XmlSerializerはうまく動作します。コレクションのシリアライズに問題はありませんが、ArrayListのような型なしコレクションにはXmlArrayItem属性を使用するか、XmlSerializerコンストラクタにadditonal型情報を渡す必要がありますが、最近Listを使用する方がより簡単で簡単です。ディクショナリは直列化できませんが、そのためのラッパークラスを作成できます。私は通常、各項目に一意のIDを格納し、それを辞書のキーとして使用することができます。 次に、辞書をラップしてアイテムのコレクションとして公開するクラスを作成できます。

public class MyItem { 
    public string ID { get; set; } 
      : 
} 

public class MyList : ICollection<MyItem> { 
    private Dictionary<string,MyItem> items; 
    public MyList() { 
     items = new Dictionary<string, MyItem>(); 
    } 
    void Add(MyItem item) { 
     items.Add(item.ID, item); 
    } 
     : 
}