java - Kryo 反序列化期间无法加载类异常

标签 java serialization deserialization kryo

我正在使用 Kryo 进行序列化/反序列化,并且没有事先注册类(我正在研究这一点)。也就是说,在反序列化时,我遇到了异常:

无法使用 kryo 的 ClassLoader 加载类 shell.api.model.BatteryStatuo。使用当前重试..

现在,我的类名实际上是 shell.api.model.BatteryStatus,所以我不确定序列化过程中发生了什么。

类名的长度有限制吗?

此外,当我序列化具有嵌套结构并且可能具有循环引用的 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 是父类,在本例中: shell.api.model.Heartbeat

并且,Heartbeat 内部有几个实体,其中之一是 BatteryStatus。

最佳答案

Kryo 可以处理复杂的嵌套对象和循环引用的序列化和反序列化。这也是这么多人喜欢 Kryo 的部分原因!

由于您发送的对象可能是多种可能类型之一,因此您应该使用 writeClassAndObjectreadClassAndObject 方法。

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));
}

Docs here

关于java - Kryo 反序列化期间无法加载类异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124811/

相关文章:

java - Hibernate 搜索和外部类

java - 在 Tomcat 从 SESSIONS.ser 反序列化后,你如何依赖注入(inject)标记为 @Configurable 的 bean?

java - 使用 HashSet 字段解码响应实体的 Jersey 问题

java - 将Character转换为char以及将char转换为Character Java

Java 序列化 - java.io.InvalidClassException 本地类不兼容

java - 如何让应用程序关闭其 GUI 并在 android 中在后台工作

java - 动态命名类的实例?

java - 取消周转 worker 的问题

javascript - 通过 JSONAPI-Serializer 进行反序列化时遇到奇怪的问题

java - Avro 模式不支持向后兼容性