繁体   English   中英

Java对象的序列化

[英]Serialization of Java Objects

我正在尝试评估正在开发的Java应用程序中使用序列化对象的有用性。 我试图确定以下内容对于对象序列化实现是否有意义,或者是否应该自定义构建传输。 这是我的情况:

  • 对象将通过TCP从一个应用程序传输到另一个应用程序。
  • 序列化的对象将是存储在公共库中的类的实例。

样本类别:

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”,它还会序列化并发送“壁橱”实例(在mainRoom中保留roomWithinRoom实例变量吗?)

谢谢大家!

是的,Java序列化确实做得很好。 也许太好了。 我很幸运写文件。 使用TCP时,请确保在每次写入后调用reset Java将一次性发送整个网络图-您的对象,所有对象引用,它们引用的所有对象,依此类推。 一个writeObject 可以发送千兆字节的数据。 但是,如果不进行重置,则如果您编写的下一个对象包含在第一个图形中,则所有遇到的操作将是对先前发送的对象的引用。 任何更新的数据将被忽略。 (我有没有提到您应该在每个writeObject之后调用reset ?)

我建议使用Externalizable接口。 这使您可以更好地控制所写内容。 (实际上,这是在类的基础上完成的,因此某些类可以序列化,而某些可外部化则没有问题。)这意味着即使类有所更改,您也可以使用相同的格式编写。 它使您可以跳过不需要的数据,有时还可以将琐碎的对象作为数据基元传递。 我还使用版本号,以便该类的新版本可以读取旧版本编写的内容。 (与TCP相比,写入文件时这要重要得多。)警告:读取类时,请注意,您刚刚读取的对象引用可能不会引用任何数据(即,未读取被引用的对象)还没有;您正在查看对象数据移至的统一存储器。)

您可能会对此感到有些困惑,但是一旦您了解了它,它的确会很好地工作。

引用将保留在对象图中,并且任何嵌套的对象只要实现了可序列化的接口,也将被正确序列化,并且不会标记为瞬态。

我建议不要使用内置的Java序列化,因为它比其他二进制协议更冗长。 同样,序列化/反序列化例程在运行时之间总是可能会发生变化。

由于这些原因,我建议使用ProtoBufs ProtoBuf体积小,速度快,并且甚至可以用于以Java以外的其他语言快速构建序列化/反序列化例程,前提是您找到了该语言的protobuf“编译器”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM