【问题标题】:Does serialization not always end in serializing primitive types?序列化不总是以序列化原始类型结束吗?
【发布时间】:2023-03-29 11:22:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java serialization kryo


    【解决方案1】:

    是的,在一个完美的世界里,你应该只序列化 pojos,而 pojos 应该是一个“原始数据类型树”。但这并不容易。

    为了速度快,Kryo 默认不使用 java 序列化。它有他自己的序列化器FieldSerializer,它内省实例并按字段对其进行序列化。这个序列化器没有使用readResolvewriteReplace这样的默认方法,并且无法恢复某些对象的行为。

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

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

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

    Kryo 带有一个特殊的序列化程序,JavaSerializerExternalizableSerializer,它们使用默认的 java 序列化,但它们会阻止 Kryo “看到”内部字段,并且您会失去使用 Kryo 的所有好处。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多