Использование атрибута XML с IntermediateSerializer - PullRequest
2 голосов
/ 18 марта 2012

Я делаю игру с XNA и пытаюсь записать всю информацию об уровне в XML с помощью IntermediateSerializer .

До сих пор у меня не было проблем с этим, ноВ 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>

Можно ли каким-либо образом получить атрибут «Tag», не создавая сериализатор для всего MapContent?

Или еще какой-нибудь другой способ сделать XML эффективным, но без использования атрибутов?

1 Ответ

1 голос
/ 10 апреля 2013

Вы всегда можете написать свое собственное расширение XML Content Pipeline.Я не большой поклонник Промежуточного Сериализатора, потому что, как вы говорите, работать с любым сложным XML довольно сложно.

Простое руководство можно найти здесь: http://roy -t.nl / index.php / 2010/08/07 / xna-xml-contentimporter /

Это также позволит вам использовать XPath для получения необходимой информации от вашегоXML, с которым, на мой взгляд, значительно проще работать.

В нем могут отсутствовать некоторые части, но вы можете дополнить те, которые используют это руководство, в котором более подробно рассматриваются расширения Content Importer (и создание карт!):http://rbwhitaker.wikidot.com/content-pipeline-extension-1

Если эти маршруты не подходят, я считаю, что вы правы в своем утверждении, что вам придется написать сериализатор для всего содержимого карты.

...