传输Java序列化对象

时间:2012-06-05 21:53:34

标签: java serialization data-structures software-distribution

是否可以在一个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.

谢谢大家,非常感谢任何评论或帮助。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这样可行,但Java序列化因为难以“演化”类而臭名昭着 - 内部表示明显与磁盘格式相关联。您可以使用自定义读取器/写入器方法解决此问题,但您可能会考虑使用更可移植的格式,如JSON或XML,而不是对象序列化。