繁体   English   中英

Kryo反序列化时无法加载class异常

[英]Unable to load class exception during Kryo deserialization

我正在使用 Kryo 进行序列化/反序列化,而不是事先注册类(我正在努力)。 也就是说,在反序列化时,我得到了异常:

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

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

类名的长度有限制吗?

另外,当我序列化 JPA 具有嵌套结构并可能具有循环引用的实体时,这会带来潜在的问题吗? 如果是这样,我想我会看到堆栈溢出异常。

这是序列化 object 的片段:

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的部分原因!

由于要发送的对象可能是许多可能的类型之一,因此应使用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));
}

文件在这里

另一种可能性是您在项目中使用了两个不同版本的 Kryo jar,并且在序列化和反序列化中使用了不同的版本类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM