我正在尝试评估在我正在开发的 Java 应用程序中使用序列化对象的有用性。我正在尝试确定以下内容对于对象序列化实现是否有意义,或者我是否应该自定义构建传输。这是我的场景:
- 对象将通过 TCP 从一个应用程序传输到另一个应用程序。
- 序列化对象将是存储在公共(public)库中的类的实例。
示例类:
public class Room implements Serializable {
// Instance Variables
private Room roomWithinRoom;
// ...
}
所以我的问题是,由于我将有几个实例变量引用回 Room 类,我可以使用 Java 序列化来完成 Room 对象的传递吗?如果我能够做到这一点,指针会被保留吗?
例子:
Room mainRoom = new Room();
Room closet = new Room();
mainRoom.addRoom(closet);
如果我发送对象“mainRoom”,它是否也会序列化并发送“closet”实例(在 mainRoom 中保留 roomWithinRoom 实例变量?)
非常感谢大家!
最佳答案
是的,Java 序列化确实做得很好。也许太好了。我很幸运写文件。对于 TCP,请务必在每次写入后调用 reset
。 Java 将一次性发送整个网络图——您的对象、所有对象引用、它们引用的所有对象,等等。一个 writeObject 可以发送千兆字节的数据。但是如果没有重置,如果你写的下一个对象包含在第一个图中,那么所有将经过的将是对先前发送的对象的引用。任何更新的数据都将被忽略。 (我有没有提到你应该在每个 writeObject
之后调用 reset
?)
我建议使用 Externalizable 接口(interface)。这使您可以更好地控制写入的内容。 (实际上,这是在类的基础上完成的,因此一些类可以是可序列化的,而一些类是可外部化的,没有问题。)这意味着即使类稍有变化,您也可以以相同的格式编写。它可以让您跳过不需要的数据,有时还可以将琐碎的对象作为数据原语传递。我还使用版本号,这样新版本的类就可以阅读旧版本编写的内容。 (这在写入文件时比使用 TCP 更重要。)警告:在读取类时,请注意您刚刚读取的对象引用可能不引用任何数据(即,引用的对象尚未读入;您正在查看对象数据将所在的未初始化内存。)。
您可能会摸不着头脑,但一旦您理解了它,它就会非常有效。
关于java - Java 对象的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555138/