2013-12-19 2 views
2

У меня есть абстрактный класс Screen и дочерние классы: GameScreen, SpellScreen, StatsScreen и т.д.Сериализация иерархическую структуру объектов в Java

Игра работает таким образом: а Renderer класс создает корень

Screen screenRoot = new GameScreen() 

, который затем может бесплатно добавлять к себе экраны, которые затем могут добавлять экраны к себе и, таким образом, они уходят. Поэтому формируется древовидная структура, каждый экран содержит список его дочерних экранов.

Теперь мне интересно, можно ли выполнять сериализацию и десериализацию - я хотел бы воссоздать все экраны в одной иерархии.

Достаточно ли сериализовать только объект screenRoot, а затем десериализовать его (при условии, что я хочу сохранить дерево всех экранов), или мне нужно каким-то образом пересечь дерево?

Как бы вы это сделали?

P.S. игра для Android и использует OpenGL ES 2.0.

+2

Я предлагаю разделения UI, логики и данных (MVC), так что вы можете использовать POJO, как простые типизированные объекты данных для сериализации (возможно, с использованием Json или XML с JAXB) – Sam

ответ

3

Иерархия объектов не является препятствием для использования Java Serialization, поскольку последняя может справиться с произвольными объектными графами - и да, сериализация объекта с использованием Java Serialization будет сериализовать все объекты, к которым он относится (если эта ссылка не отмечена transient) , Если предположить, что это то, что вы хотите, сериализации иерархии так просто, как:

try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(filename)))) { 
    oos.write(rootScreen); 
} 

и чтение просто:

try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filename)))) { 
    return (GameScreen) ois.readObject(); 
} 
2

Здесь есть две проблемы.

Во-первых, экраны должны быть именно такими - экранами. Они не должны содержать «модель» или данные объекта, которые представляют ваше состояние игры; только представление/рендеринг этого состояния. Таким образом, сериализация и десериализация, на самом деле не имеет смысла. Я бы предложил снова взглянуть на вашу архитектуру, чтобы убедиться, что это действительно то, что вы хотите сделать.

Если вы решили сделать это, или если у вас есть другой корень объекта игрового состояния, который вы можете сериализовать (я обычно использую Player, так как он содержит все основные данные), вы можете легко сделать это с помощью Gson:

// Save 
RootObject o = ...; // The root of the hierarchy to serialize 
Gson gson = new Gson(); 
String serialized - gson.toJson(o); // JSON object, eg. { "Player": { ... } } 

// Load 
RootObject deserialized = gson.fromJson(serialized, RootObject.class); 

Вы можете прочитать в их user guide.

Во-вторых, по вопросу JSON и Gson: Я предпочитаю эту стандартную сериализацию, потому что она устойчива перед изменениями. Если ваши определения классов изменяются, вы можете десериализовать объекты (хотя вы получите пустое или пустое поля) вместо исключения времени выполнения; вам также не нужно беспокоиться о версировании ваших классов.

Редактировать: вопросы, подобные этому, лучше подходят для Game Dev SE site.

+0

Я принял ответ meriton, потому что это именно то, что я собираюсь делать сейчас. – PawelP

+0

Ваш вход помогает много, хотя, я вижу, что дизайн, который я планировал, далек от прочного (SOLID, тоже ...). Это далеко от MVC, и есть жесткий срок (это моя игра BSc :)). Есть ли какой-то конкретный ресурс, который вы могли бы мне порекомендовать, если учесть хорошую архитектуру? (основное внимание уделяется практике/примерам, а не теории). Gson/Json выглядит красиво, я тоже попробую это узнать. – PawelP

+1

Я обновил свой ответ, чтобы упомянуть, почему Gson является удивительным по сериализации. Я предлагаю сосредоточиться на минимальных изменениях, которые вам нужно выполнить, и использовать «истории» (небольшие, функциональные функции, ориентированные на пользователя) + контроль версий. Это долгий путь. – ashes999

Смежные вопросы