XNAでXMLファイルをコンテンツファイルとして使用する方法


9

ゲームで使用できるさまざまな自動車メーカーを表すXMLファイルがあります。ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="List[string]">
    <car>Audi</car>
    <car>BMW</car>
    <car>Nissan</car>
    <car>Volvo</car>
  </Asset>
</XnaContent>

コンテンツフォルダーに追加すると、コンパイラーは次のエラーを返します。

There was an error while deserializing intermediate XML. Cannot find type "List`1"

文字列のリストを作成してXMLに入れ、XNAから読み取るにはどうすればよいですか?


逆シリアル化コードはここで役立ちます。
Tetrad、2011

3
逆シリアル化コードはありません。多分これが私の問題が始まる場所ですか?
2011

3
Tetradの質問に答えるために、おそらくefllesはXmlImporterXNA Content Pipelineの一部であるを使用しています。パイプラインは、XMLを非シリアル化してXNBファイル(ContentManager実行時に読み込まれる)に変換します。
Andrew Russell、

回答:


14

私は、XMLの何が問題なのかを正確に突き止めようとはしていません。おそらく名前空間が不足しているためです。しかし、これが正しいXMLです。

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Generic="System.Collections.Generic">
  <Asset Type="Generic:List[string]">
    <Item>Audi</Item>
    <Item>BMW</Item>
    <Item>Nissan</Item>
    <Item>Volvo</Item>
  </Asset>
</XnaContent>

内部でXmlImporterIntermediateSerializerクラスが使用されます。だから、次のような小さなプログラムは、あなたのXMLがどのような決定するために使用することができる必要があるように見えます。

var test = new List<string>(){ "Audi", "BMW", "Nissan", "Volvo" };
var sb = new StringBuilder();
using(XmlWriter writer = XmlWriter.Create(sb))
{
    IntermediateSerializer.Serialize(writer, test, null);
}
Console.Write(sb.ToString());

(出力をストリームに変換し、それをDeserializeメソッドに渡してオブジェクトを再構築することもできます-確実に機能していることを確認してください。また、ヘッダーに適切なエンコーディングをStringBuilder挿入する価値があるでしょう-例:is utf-16 。)

に関する詳細情報についてはIntermediateSerializerこの投稿から始まり、2008年8月までアーカイブを継続するShawn Hargreavesのブログをご覧ください。


1
+1これに関するShawn Hargreavesの一連の投稿は素晴らしいです。XMLを生成する最も簡単な方法は、すべて同じコードを持つ「LevelEditor」プロジェクトを用意することですが、コンテンツパイプラインアセンブリを参照するので、コードにデフォルトの属性でオブジェクトを作成し、XMLにシリアル化して、実際にロードすることができます。ゲームプロジェクト。
michael.bartnett 2011

0

コード例でその方法を確認したい場合は、http: //create.msdn.com/en-US/education/catalog/sample/collisionのようにxmlを使用するサンプルを以下に示し ます。

何が起こっているのかを説明する記事を読み、xmlとコンテンツプロセッサの操作方法に関する洞察を得たい場合は、このリンクに移動して、中間シリアライザセクションまでスクロールし、そこで8または9の記事を読んでください。 http://www.talula.demon.co.uk/blogindex.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.