Java Deep Copy без сериализации - PullRequest
       8

Java Deep Copy без сериализации

2 голосов
/ 02 сентября 2011

Я пишу карточную игру для Android, и я отчаянно застрял в том, как сохранить свое игровое состояние. Чтобы кратко объяснить мою программу, у меня есть класс Sprite для отображения моих карт, который содержит растровое изображение, точку для позиции и ограничивающий прямоугольник. Я унаследовал этот класс, чтобы создать класс карт, который имеет две битовые карты, которые переключаются в зависимости от того, карта лицевой стороной вверх или вниз, и перечисления для хранения масти и ранга. Эти объекты карты размещаются в объектах CardStack, которые содержат и дополнительную позицию, и массив карт. Модель игры состоит из различных карточных стеков и правил перемещения карт между стопками. Игра отлично работает как есть.

Теперь я пытаюсь выяснить, как сохранить состояние моей игры. Я хотел бы сериализовать весь игровой объект и сохранить его в файл. Однако существует множество объектов (растровое изображение, точка, прямоугольник, цвет и т. Д.), Которые нельзя сериализовать. В C # я знаю, что вы можете использовать MemoryStream и просто скопировать весь объект, но я не могу найти подобный метод в Java, который не требует, чтобы все было сериализуемым. Есть ли что-нибудь подобное в Java? Есть ли лучший способ, которым я мог бы структурировать объект игровой модели? Любой совет будет принята с благодарностью. Спасибо!

Ответы [ 4 ]

4 голосов
/ 02 сентября 2011

абстрагирует графический интерфейс пользователя в бизнес-объекты и заставляет объекты графического интерфейса инкапсулировать эти бизнес-объекты

таким образом, карте не нужно знать, какое растровое изображение нужно отображать (или даже вообще отображать)

эти бизнес-объекты - это то, что вы хотите сериализовать, и графический интерфейс можно восстановить из десериализованных объектов

1 голос
/ 02 сентября 2011

Вы всегда можете написать свои собственные настроенные методы сериализации в среде сериализации Java. См. Сериализуемый .

Классы, которые требуют специальной обработки в процессе сериализации и десериализации, должны реализовывать специальные методы с такими точными сигнатурами:

private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData()  throws ObjectStreamException;

Вы правы, что реализация Java по умолчанию завершится с ошибкой, если ваш объект содержит несериализуемые объекты, но вы можете определить, как их сериализовать, указанными выше методами.

Также: на Android вы можете использовать Parcelable, который является версией сериализации для Android.

0 голосов
/ 25 февраля 2019

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

0 голосов
/ 02 сентября 2011

Взгляните на буферы протокола (protobuf)

...