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

标签 java serialization kryo

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

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

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

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

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

最佳答案

是的,在完美的世界中,您应该只序列化 pojo,并且 pojo 应该是“基元数据类型树”......但这并不那么容易。

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

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

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

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

Kryo 带有一个特殊的序列化器,JavaSerializerExternalizedSerializer,它们使用默认的 java 序列化,但它们阻止 Kryo“查看”内部字段,并且您失去了使用 Kryo。

关于java - 序列化并不总是以序列化原始类型结束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473468/

相关文章:

java - 如何创建一棵包含一个根节点和几个子节点的 json 树

java - 从自定义对象到 sqlite 行的动态转换

java - 反序列化序列化对象以在java中进行映射

java - Kryo 反序列化失败,返回 "KryoException: Buffer underflow"

java - 如何检查一对是否已经存在?

java - GWT 无法从 servlet 检索结果

Android - LinkedHashMap无法在Activity之间传递

java - 使用 JsonTypeInfo WRAPPER_OBJECT 进行 Jackson 序列化

scala - 在 twitter chill 中处理案例类(Scala 接口(interface)到 Kryo)?

java - 如何使用 Kryo 序列化 Joda-Time 的 LocalDate