2017-11-05 16 views
0

私はKryoをシリアル化/逆シリアル化に使用していますが、事前にクラスを登録していません。つまり、逆シリアル化時に例外が発生します。Kryoの逆シリアル化中にクラス例外をロードできません。

クラスshell.api.model.BatteryStatuoをkryoのClassLoaderで読み込めません。現時点での再試行

私のクラス名は実際には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内部には複数のエンティティがあり、そのうちの1つはBatteryStatusです。

答えて

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

+0

おかげで - 私はそれを試してみて、戻って報告します。 – Walter

関連する問題