2017-11-05 3 views
0

Ich benutze Kryo für Serialisierung/Deserialisierung und nicht im Voraus Klassen registrieren (ich arbeite daran). Bei der Deserialisierung erhalte ich die Ausnahme:Kann Klassenausnahme während Kryo Deserialisierung nicht laden

Kann die Klasse shell.api.model.BatteryStatuo nicht mit kryos ClassLoader laden. Erneut versuchen mit Strom ..

Jetzt ist mein Klassenname tatsächlich shell.api.model.BatteryStatus, also bin ich nicht sicher, was während der Serialisierung passiert ist.

Gibt es eine Beschränkung für die Länge des Klassennamens?

Auch, wie ich JPA-Entitäten serialisieren, die verschachtelte Strukturen haben und wahrscheinlich Zirkelbezüge haben, wird das ein potenzielles Problem darstellen? Ich würde denken, ich würde eine Stapelüberlauf Ausnahme sehen, wenn ja.

Dies ist ein Ausschnitt aus der Serialisierung eines Objekts:

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)); 
    } 

Deserialisierung:

try (final Input input = new Input(inputStream)) { 
     return ((Serializable) kryo.readObject(input, entityType)); 
    } 

entityType ist die Elternklasse, in diesem Fall: shell.api.model.Heartbeat

und innerhalb von Heartbeat sind mehrere Entitäten, von denen einer BatteryStatus ist.

Antwort

1

Kryo kann Serialisierung und Deserialisierung komplexer verschachtelter Objekte und Zirkelreferenzen handhaben. Das ist einer der Gründe, warum so viele Leute Kryo lieben!

Da das Objekt, das Sie senden, einer von vielen möglichen Typen sein kann, sollten Sie die Methoden writeClassAndObject und readClassAndObject verwenden.

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)); 
    } 

Und

try (final Input input = new Input(inputStream)) { 
    return ((Serializable) kryo.readClassAndObject(input)); 
} 

Docs here

+0

Dank - ich werde versuchen, dass und berichten. – Walter

Verwandte Themen