2

私は XNA でゲームを作成しており、IntermediateSerializerを使用してすべてのレベル情報を XML に書き込もうとしています。

これまでのところ問題はありませんでしたが、XML にはタグが多すぎるので、もっと効率的にしたいと考えています。

たとえば、私はこれを持っています:

<Asset Type="Data:MapContent">
  <Zone>Jungle</Zone>
  <MapID>Jungle01</MapID>
  <Size>42 40</Size>
  <Objects>
    <MapObject>
      <Tag>Tree</Tag>
      <Position>12.10001 1.41174912 9.433376</Position>
    </MapObject>
    <MapObject>
    ...

私はこれに目を向けたいと思います:

<Asset Type="Data:MapContent">
  <Zone>Jungle</Zone>
  <MapID>Jungle01</MapID>
  <Size>42 40</Size>
  <Objects>
    <MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject>
    ...

これは私が MapObject 用に作成しようとしたシリアライザーです

[ContentTypeSerializer]
class MapObjectSerializer : ContentTypeSerializer<MapObject>
{
    protected override void Serialize(IntermediateWriter output, MapObject value, ContentSerializerAttribute format)
    {
        output.Xml.WriteAttributeString("Tag", value.Tag);
        output.WriteObject(value.Position, new ContentSerializerAttribute() { ElementName = "Position", FlattenContent = true });
    }

    protected override MapObject Deserialize(IntermediateReader input, ContentSerializerAttribute format, MapObject existingInstance)
    {
        existingInstance.Tag = input.Xml.GetAttribute("Tag");
        string[] pos = input.Xml.ReadElementString().Split(' ');
        existingInstance.Position = new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2]));
        return existingInstance;
    }
}

Serialize 関数は機能し、必要な正確な XML を取得できますが、Deserialize メソッドは機能しません。メソッドが呼び出されると、XML パーサーは既に次の位置にあるように見えます。

                      v
<MapObject Tag="Tree">12.10001 1.41174912 9.433376</MapObject>

MapContent 全体のシリアライザーを記述せずに「タグ」属性を取得する方法はありますか?

または、属性を使用せずに XML を効率的にする他の方法はありますか?

4

1 に答える 1

1

独自の XML コンテンツ パイプライン拡張機能の作成をいつでも検討できます。私は Intermediate Serializer の大ファンというわけではありません。なぜなら、あなたが言うように、複雑な XML を扱うのはかなり大雑把だからです。

簡単なガイドはこちらにあります: http://roy-t.nl/index.php/2010/08/07/xna-xml-contentimporter/

このようにすれば、XPath を使用して必要な情報を XML から取得することもできるようになります。私の意見では、これは非常に扱いやすいものです。

いくつかの部分が欠けているかもしれませんが、Content Importer Extensions についてより完全に説明しているこのガイド (およびマップの実行!) を使用してそれらを補足できます: http://rbwhitaker.wikidot.com/content-pipeline-extension-1

これらのルートがオプションではない場合、マップ コンテンツ全体のシリアライザーを作成する必要があるという主張は正しいと思います。

于 2013-04-10T18:38:40.430 に答える