有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用Kryo进行序列化/反序列化,并且没有事先注册类(我正在进行这方面的工作)。也就是说,在反序列化时,我得到了一个例外:

无法加载类shell。应用程序编程接口。模型用kryo的类加载器的Batterystato。正在使用当前

现在,我的类名实际上是shell。应用程序编程接口。模型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是父类,在本例中: 壳应用程序编程接口。模型心跳

在Heartbeat内部有几个实体,其中一个是BatteryStatus


共 (1) 个答案

  1. # 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