我正在使用Kryo在我正在处理的代码中创建游戏保存。
使用默认的序列化程序FieldSerializer,我序列化了一个庞大的POJO。 它是一个包含我创建的其他类和原始类型的类。
我的游戏世界的整个状态都会保存并完全正确加载,而无需创建任何自定义序列化程序。
我唯一能想到的是改善磁盘空间或序列化/反序列化的速度。
答案 0 :(得分:1)
是的,在一个完美的世界中,你应该只序列化pojos,而pojos应该是原始数据类型的树......但它并不那么容易。
为了快速,Kryo默认不使用java序列化。它有自己的序列化程序FieldSerializer
,它可以内省实例并按字段对字段进行序列化。此序列化程序不使用readResolve
writeReplace
之类的默认方法,并且无法恢复某些对象行为。
例如,想象一个简单的POJO,它拥有Date
属性。这个"原始数据类型"没有任何可序列化的字段(全部标记为瞬态):他的序列化过程是通过readObject
或writeObject
完成的:默认的FieldSerializer不起作用。
如果您的POJO具有集合属性,并且您使用Collections.emptyList()
创建了一个实例,那么这可以工作..或者不是:" emptyList"集合应该是单例,并且此行为是通过readResolve
方法完成的。 FieldSerializer并不了解它。
Kryo附带了一组默认的序列化程序,可以处理这种类型,但有时,你必须创建自己的序列化程序来处理具有特定行为的类。但通常,您创建一个序列化程序以提高经常序列化的类的速度,而不是因为Kryo无法序列化它们。
Kryo附带了一个特殊的序列化程序JavaSerializer
或ExternalizableSerializer
,它使用默认的java序列化,但它们阻止Kryo"查看"内部领域,你失去了使用Kryo的所有好处。