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

时间:2016-02-18 05:23:27

标签: java serialization kryo

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

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

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

  • 并非所有类树最初都是从原始数据构建的 类型?
  • 为什么还需要其他序列化工具?

我唯一能想到的是改善磁盘空间或序列化/反序列化的速度。

1 个答案:

答案 0 :(得分:1)

是的,在一个完美的世界中,你应该只序列化pojos,而pojos应该是原始数据类型的树......但它并不那么容易。

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

例如,想象一个简单的POJO,它拥有Date属性。这个"原始数据类型"没有任何可序列化的字段(全部标记为瞬态):他的序列化过程是通过readObjectwriteObject完成的:默认的FieldSerializer不起作用。

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

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

Kryo附带了一个特殊的序列化程序JavaSerializerExternalizableSerializer,它使用默认的java序列化,但它们阻止Kryo"查看"内部领域,你失去了使用Kryo的所有好处。