1

是否可以在一个 Java 程序/类中声明一个可序列化对象的实例,然后在另一个程序/类中完全重复内部对象的定义,并从数据文件中加载一个大的复杂对象?目标是能够为本地保存在我的构建机器上的项目编写编辑器,然后编写游戏本身并将其分发给想要玩游戏的人。

我正在用 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.

谢谢大家,任何意见或帮助将不胜感激。

4

3 回答 3

3

序列化对象时,对象的每个字段都会被序列化,除非用transient. 而且这种行为当然是递归的。所以是的,你可以序列化一个对象,然后反序列化它,反序列化的对象将与序列化的对象具有相同的状态。不同的行为会使序列化变得无用。

不过,我不会使用本机序列化来长期存储数据。序列化的对象很难检查,无法使用文本编辑器进行修改,并且很难与旧版本的类保持向后兼容性。我会使用更开放的格式,例如 XML 或 JSON。

于 2012-06-05T21:59:06.160 回答
1

这将起作用,但是 Java 序列化因难以“进化”类而臭名昭著——内部表示明确地与磁盘格式相关联。您可以使用自定义读取器/写入器方法解决此问题,但您可能会考虑使用更便携的格式,例如 JSON 或 XML,而不是对象序列化。

于 2012-06-05T22:14:35.193 回答
1

是的,这是可能的。如果一个对象被正确序列化,它可以在任何其他机器上反序列化,只要运行在那里的应用程序知道要反序列化的类的定义。

于 2012-06-05T22:02:05.053 回答