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

时间:2017-11-05 18:02:00

标签: java serialization deserialization kryo

我正在使用Kryo进行序列化/反序列化,而不是事先注册类(我正在研究它)。也就是说,在反序列化时,我得到了例外:

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

现在,我的classname实际上是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。

1 个答案:

答案 0 :(得分:1)

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