簡體   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