C # XML-сериализация и вовлеченное наследование - PullRequest
1 голос
/ 04 ноября 2010

У меня есть движок 2D игр в XNA, который развивается довольно хорошо. Выложено так:

Центральный GameManager, содержащий список SceneObjectManager (для многоуровневой обработки).

SceneObjectManager содержит коллекцию SceneObjects (класс, который наследуется от List, с перегруженным оператором [string]), который является абстрактным базовым классом со строкой для идентификатора объекта.

Есть классы SceneObject2D и AnimatedSceneObject2D, которые наследуются в цепочке (2D от SceneObject, анимированные из 2D). Они содержат соответствующую информацию (положение, исходный прямоугольник, анимации и т. Д.).

Затем у меня есть второй проект (настоящая игра, использующая движок), который имеет такие вещи, как PlayerObject, AIObject, FireballScript и т. Д., Которые наследуются от SceneObject2D и AnimatedSceneObject2D в зависимости от того, что ему нужно (если он отображается, анимируется или даже нет).

Это еще не все, но вы получите картину.

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

Довольно простая концепция ... чистить, выбирать сущности, задавать атрибуты и, в конечном итоге, экспортировать XML-файл, который будет содержать каждую сущность, их позиции и атрибуты, идентификаторы и т. Д. Однако проблема заключается в самой сериализации XML в сохранить объекты.

По сути, я бы сериализовал GameManager, который содержит все менеджеры сцены и все объекты сцены. Тогда я мог бы просто загрузить файл XML, и мой уровень был бы. Но возникает проблема наследования и более сложных объектов, содержащих объекты (и интерфейсы и все такое).

Я не вижу себя записывающим [XmlInclude (typeof (T))] для каждой отдельной сущности для каждого класса, который будет базовым классом, не говоря уже о более сложных объектах.

Я начал наследовать IXmlSerializable, но прежде чем я зайду слишком далеко в этом стремлении выписать WriteXml и ReadXml для всех моих объектов, я хотел бы знать, есть ли лучший, более простой способ сделать это.

Я бы отметил, что это должен быть переносимый формат (следовательно, XML), поскольку я хотел бы повторно использовать экспорт редактора с некоторыми изменениями для использования в движке C ++, который использует ту же схему классов ( Я думаю об использовании Boost.serialization для этого).

1 Ответ

0 голосов
/ 07 ноября 2010

Я использовал XML-сериализатор с открытым исходным кодом, который называется YAXLib . При сериализации он сохраняет «настоящий» тип конкретных классов, и мне удалось сериализовать мою коллекцию диспетчеров объектов сцены.

Я могу десериализовать их позже в моем движке C ++, как только я перенесу весь свой движок (вероятно, я собираюсь написать свой собственный десериализатор с использованием TinyXML из-за предыдущего опыта работы с ним).

...