1

Можно ли объявить экземпляр сериализуемого объекта в одной программе/классе Java, затем полностью повторить определения внутренних объектов в другой программе/классе и загрузить в большой сложный объект из файла данных? Цель состоит в том, чтобы иметь возможность писать редактор для элементов, которые хранятся локально на моей машине сборки, а затем писать саму игру и распространять ее для людей, которые хотели бы играть в игру.Передача Java Serialized Object

Я пишу игру на Java как проект для любителей. В моей игре есть семейство классов, которые расширяют родительский класс GameItem. Элементы могут быть в разных семействах, таких как HealingPotion, Bomb, KeyItem и т. Д.

class GameItem implements Serializable { 
String ItemName 
String ImageResourceLocation 
....} 

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

class GameItemList implements Serializable { 
LinkedList<GameItem>gameItemList; 
//methods here like LookUpByName, LookUpByIndex that return references to an item 
} 

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

//create itemList 
FileInputStream fileIn = new FileInputStream("items.dat"); 
ObjectInputStream in = new ObjectInputStream(fileIn); 
GameItemList allItems = (GameItemList)in.readObject(); 
in.close(); 
//Now I have an object called allItems that can be used for lookups. 

Спасибо, ребята, какие-либо комментарии или помощь будет принята с благодарностью.

+0

Возможно, вас увлекает Remote Method Invocation (RMI). – emory

ответ

3

При сериализации объекта каждое поле объекта сериализуется, если не отмечено transient. И это поведение, конечно, рекурсивное. Итак, да, вы можете сериализовать объект, а затем десериализовать его, а десериализованный объект будет иметь такое же состояние, как сериализованное. Другое поведение сделает сериализацию бесполезной.

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

1

Да, это возможно. Если объект правильно сериализован, его можно десериализовать на любом другом компьютере, пока запущенное приложение знает определение класса, подлежащего десериализации.

1

Это будет работать, но сериализация Java печально известна тем, что трудно «развить» классы - внутреннее представление явно привязано к формату на диске. Вы можете обойти это с помощью специальных методов чтения/записи, но вы можете рассмотреть более переносимый формат, такой как JSON или XML, вместо сериализации объектов.

+0

Внутреннее представление не объяснено в привязке к формату на диске. Формат на диске имеет отдельную собственную спецификацию, которая в широком смысле состоит из одного объекта тега типа и пар имя-значение для сериализуемых элементов. – EJP

+0

Он сериализует все частные поля, если вы не пишете пользовательский ридер/писатель. Разве это не то, что такое внутреннее представление? –

+0

Он сериализует все нестатические непереходные поля в формате, определенном отдельной спецификацией. Вы можете вставлять или удалять или изменять порядок полей, не нарушая совместимость с предварительно сериализованными объектами. Вы не можете описать это как «явно привязанное к внутреннему представлению». NB private не имеет к этому никакого отношения. – EJP

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