我正在尝试使用 Kryo 保存一个非常大的对象,
public static byte[] toBytes(KryoPool kryoPool, Object object) {
try (Output output = new Output(32768, Integer.MAX_VALUE - 8)) {
kryoPool.run(kryo -> {
kryo.setReferences(false);
kryo.writeObject(output, object);
return null;
});
return output.toBytes();
}
}
我得到了异常:
com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: 1
at com.esotericsoftware.kryo.io.Output.require(Output.java:167)
at com.esotericsoftware.kryo.io.Output.writeByte(Output.java:225)
at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:623)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:86)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:508)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:651)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:100)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:40)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:575)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:79)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:508)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:557)
这个字节数组应该保存到 Oracle 表的 Blob 字段中。 我现在意识到两件事:
- byte[]的大小有限制,不能大于2^31-1?我应该如何处理大于 max 尺寸的非常大的物体。字节数组?
- 如何避免Kryo Buffer溢出异常?
更新: 多谢。我只是想知道在哪一点我应该调用 Kryo 序列化:
try (final PreparedStatement pstmt = conn.prepareStatement("INSERT INTO DATA_STORAGE (ID, VALUE) VALUES (?, ?)"))
{
final Blob blob = conn.createBlob();
OutputStream out = blob.setBinaryStream(0L);
Output output = new Output(out);
pstmt.setInt(1, id);
pstmt.setBlob(2, blob);
//probably here?
kryoPool.run(kryo -> {
kryo.setReferences(false);
kryo.writeObject(output, object);
return null;
});
pstmt.executeUpdate();
}
最佳答案
不要创建中间byte[]
,而是直接流式传输到 BLOB:
try (Output output = new Output(blob.setBinaryStream(0L))) {
....
}
关于java - 如何使用 Kryo 将非常大的 Java 对象保存到 Oracle 中的 Blob 中并避免 KryoException 缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906504/