[英]Serialization of Java Objects
我正在尝试评估正在开发的Java应用程序中使用序列化对象的有用性。 我试图确定以下内容对于对象序列化实现是否有意义,或者是否应该自定义构建传输。 这是我的情况:
样本类别:
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.