Kryo序列化系统,如何保证注册同一个类时生成相同的ID

问题描述 投票:0回答:1

我查看了Kryo的源代码,似乎在注册一个类时,它使用了自增ID,如果是这样的话,如果编写者和读者使用不同的注册顺序会发生什么,

# writer
kryo.register(Foo.class);
kryo.register(Bar.class);
# reader
kryo.register(Bar.class);
kryo.register(Foo.class);

反序列化仍然有效吗?如果没有的话,这不是一个问题吗?因为编写器和读取器很可能不在同一个应用程序中,因此没有简单的方法来确保两个寄存器类按相同的顺序,对吗?或者我在这里遗漏了什么?

java kryo
1个回答
0
投票

如果我们使用自动生成的ID,那么如果注册顺序不同,反序列化将不起作用。 Kryo 的文档中提到了。

在反序列化过程中,注册的类必须具有准确的 它们在序列化期间具有相同的 ID。注册时,一个类是 分配下一个可用的最小整数 ID,这意味着顺序 注册课程很重要。

有一个选项可以在注册类时传递整数 ID。这样我们就不用担心订单的问题了

kryo.register(Foo.class, 1);
kryo.register(Bar.class, 2);

您还可以使这些 ID 成为类的静态最终成员。

class Foo {
  public static final int KRYO_ID = 1;
}
.
.
.
kryo.register(Foo.class, Foo.KRYO_ID);
© www.soinside.com 2019 - 2024. All rights reserved.