Kryo 反序列化期间无法加载 class 异常
Unable to load class exception during Kryo deserialization
我正在使用 Kryo 进行序列化/反序列化,而不是事先注册 classes(我正在努力)。也就是说,在反序列化时,我得到了异常:
无法使用 kryo 的类加载器加载 class shell.api.model.BatteryStatuo。正在重试当前..
现在,我的 classname 实际上是 shell.api.model.BatteryStatus 所以我不确定在序列化过程中发生了什么。
class名字的长度有限制吗?
此外,当我序列化具有嵌套结构并可能具有循环引用的 JPA 实体时,这会带来潜在的问题吗?如果是这样,我想我会看到堆栈溢出异常。
这是序列化对象的片段:
protected final Kryo kryo = new Kryo();
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (final Output output = new Output(baos)) {
kryo.writeObject(output, data);
}
return (baos.toByteArray());
} catch (IOException e) {
LOGGER.error("error serializing", e);
throw (new RuntimeException("Error serializing", e));
}
反序列化:
try (final Input input = new Input(inputStream)) {
return ((Serializable) kryo.readObject(input, entityType));
}
entityType 是父 class,在这种情况下:
shell.api.model.Heartbeat
并且,在 Heartbeat 中有几个实体,其中之一是 BatteryStatus。
Kryo 可以处理序列化和反序列化复杂的嵌套对象和循环引用。这也是为什么那么多人喜欢 Kryo 的部分原因!
由于您发送的对象可能是多种可能类型中的一种,因此您应该使用 writeClassAndObject
和 readClassAndObject
方法。
protected final Kryo kryo = new Kryo();
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (final Output output = new Output(baos)) {
kryo.writeClassAndObject(output, data);
return (baos.toByteArray());
} catch (IOException e) {
LOGGER.error("error serializing", e);
throw (new RuntimeException("Error serializing", e));
}
和
try (final Input input = new Input(inputStream)) {
return ((Serializable) kryo.readClassAndObject(input));
}
另一种可能性是您在项目中使用了两个不同版本的 Kryo jar,并且在序列化和反序列化中使用了不同版本 类。
我正在使用 Kryo 进行序列化/反序列化,而不是事先注册 classes(我正在努力)。也就是说,在反序列化时,我得到了异常:
无法使用 kryo 的类加载器加载 class shell.api.model.BatteryStatuo。正在重试当前..
现在,我的 classname 实际上是 shell.api.model.BatteryStatus 所以我不确定在序列化过程中发生了什么。
class名字的长度有限制吗?
此外,当我序列化具有嵌套结构并可能具有循环引用的 JPA 实体时,这会带来潜在的问题吗?如果是这样,我想我会看到堆栈溢出异常。
这是序列化对象的片段:
protected final Kryo kryo = new Kryo();
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (final Output output = new Output(baos)) {
kryo.writeObject(output, data);
}
return (baos.toByteArray());
} catch (IOException e) {
LOGGER.error("error serializing", e);
throw (new RuntimeException("Error serializing", e));
}
反序列化:
try (final Input input = new Input(inputStream)) {
return ((Serializable) kryo.readObject(input, entityType));
}
entityType 是父 class,在这种情况下: shell.api.model.Heartbeat
并且,在 Heartbeat 中有几个实体,其中之一是 BatteryStatus。
Kryo 可以处理序列化和反序列化复杂的嵌套对象和循环引用。这也是为什么那么多人喜欢 Kryo 的部分原因!
由于您发送的对象可能是多种可能类型中的一种,因此您应该使用 writeClassAndObject
和 readClassAndObject
方法。
protected final Kryo kryo = new Kryo();
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (final Output output = new Output(baos)) {
kryo.writeClassAndObject(output, data);
return (baos.toByteArray());
} catch (IOException e) {
LOGGER.error("error serializing", e);
throw (new RuntimeException("Error serializing", e));
}
和
try (final Input input = new Input(inputStream)) {
return ((Serializable) kryo.readClassAndObject(input));
}
另一种可能性是您在项目中使用了两个不同版本的 Kryo jar,并且在序列化和反序列化中使用了不同版本 类。