java - Java 对象的序列化

标签 java object networking serialization tcp

我正在尝试评估在我正在开发的 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/

相关文章:

javascript - 验证 4 个值中的至少两个 javascript

php - 合并多个对象

networking - 如果一个站点出于冗余原因有 2 个负载均衡器,DNS 应该指向哪一个?

java - 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

Java泛型通配符运算符

java - 在android/JAVA中改变变量的值

java - 将文件的路径发送到谷歌驱动器

javascript - Object.create() 和 toString()

java - 当目的地离线时,数据报包去了哪里?

networking - 如何在 Unix 上使用 TCPDump 查看发送到特定多播地址的消息?