序列化不总是以序列化原始类型结束吗?

Does serialization not always end in serializing primitive types?

我正在使用 Kryo 在我正在处理的代码中创建游戏存档。

我使用默认序列化器 FieldSerializer 序列化了一个大型 POJO。 它是一个 class,包含我创建的其他 classes 和原始类型。

我的游戏世界的整个状态都被完全正确地保存和加载,而无需创建任何自定义序列化程序。

我唯一能想到的就是提高磁盘 space 或 serialization/deserialization 的速度。

是的,在一个完美的世界里,你应该只序列化 pojos,而 pojos 应该是一个 'tree of primitives data types'.. 但这并不那么容易。

为了速度快,Kryo 默认不使用java序列化。它有自己的序列化器,FieldSerializer,它内省实例并逐字段序列化它。此序列化程序不使用 readResolve writeReplace 等默认方法,并且无法恢复某些对象的行为。

例如,想象一个简单的 POJO,它拥有一个 Date 属性。这个 "primitive datatypes" 没有任何可序列化的字段(都有标记为 transient ):他的序列化过程是通过 readObjectwriteObject 完成的:默认的 FieldSerializer 将不起作用。

如果您的 POJO 有一个集合 属性,并且您使用 Collections.emptyList() 创建一个实例,那么这可以工作.. 或不: "emptyList" 集合应该是一个单例,并且此行为是通过 readResolve 方法完成的。 FieldSerializer 不知道它。

Kryo 带有一组默认序列化器,可以处理这种类型,但有时,您必须创建自己的序列化器来处理具有特定行为的 class。但通常情况下,你创建一个序列化程序是为了提高你经常序列化的 classes 的速度,而不是因为 Kryo 无法序列化它们。

Kryo 带有一个特殊的序列化器,JavaSerializerExternalizableSerializer,它们使用默认的 java 序列化,但它们会阻止 Kryo 到 "see" 内部字段,你会丢失所有使用 Kryo 的好处。