我正在使用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。
答案 0 :(得分:1)
Kryo可以处理复杂嵌套对象和循环引用的序列化和反序列化。这就是为什么这么多人喜欢Kryo的部分原因!
由于您发送的对象可能是众多可能类型中的一种,因此您应使用writeClassAndObject
和readClassAndObject
方法。
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));
}