我正在使用 Kryo 在我正在处理的代码中创建游戏保存。
使用默认序列化器 FieldSerializer,我序列化了一个大型 POJO。 它是一个包含我创建的其他类和原始类型的类。
我的游戏世界的整个状态都被完全正确地保存和加载,而无需创建任何自定义序列化程序。
- 并非所有类树最初都是由原始数据构建的 类型?
- 为什么需要其他序列化器?
我唯一能想到的是提高磁盘空间或序列化/反序列化的速度。
最佳答案
是的,在完美的世界中,您应该只序列化 pojo,并且 pojo 应该是“基元数据类型树”......但这并不那么容易。
为了快速,Kryo 默认不使用 java 序列化。它有自己的序列化器,FieldSerializer
,它内省(introspection)实例并按字段序列化它。此序列化程序不使用 readResolve
writeReplace
等默认方法,并且无法恢复某些对象行为。
例如,想象一个简单的 POJO,它拥有一个 Date
属性。这个“原始数据类型”没有任何可序列化的字段(都标记为 transient ):他的序列化过程是通过 readObject
或 writeObject
完成的:默认的 FieldSerializer 不会工作。
如果您的 POJO 有一个集合属性,并且您使用 Collections.emptyList()
创建一个实例,那么这可以工作......也可以不:“emptyList”集合应该是一个单例,并且此行为是通过 readResolve 方法完成的。 FieldSerializer 不知道这一点。
Kryo 附带了一组默认序列化器,可以处理此类类型,但有时,您必须创建自己的序列化器来处理具有特定行为的类。但通常情况下,您创建序列化器是为了提高经常序列化的类的速度,而不是因为 Kryo 无法序列化它们。
Kryo 带有一个特殊的序列化器,JavaSerializer
或 ExternalizedSerializer
,它们使用默认的 java 序列化,但它们阻止 Kryo“查看”内部字段,并且您失去了使用 Kryo。
关于java - 序列化并不总是以序列化原始类型结束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473468/