Java 将对象序列化到derby数据库的BLOB列会写入比预期更多的字节

Java 将对象序列化到derby数据库的BLOB列会写入比预期更多的字节,java,serialization,Java,Serialization,我正在尝试(反)序列化SortedMap到derby数据库表中。地图 private static Map<String, String> categories; 这将使用PreparedStatement对其进行序列化: ObjectOutputStream oop = new ObjectOutputStream(os); oop.writeObject(this.categories); byte[] b = os.toByteArray(); is = new ByteAr

我正在尝试(反)序列化SortedMap到derby数据库表中。地图

private static Map<String, String> categories;
这将使用PreparedStatement对其进行序列化:

ObjectOutputStream oop = new ObjectOutputStream(os);
oop.writeObject(this.categories);
byte[] b = os.toByteArray();
is = new ByteArrayInputStream(b);
pst.setBinaryStream(2, is, b.length);
pst.executeUpdate();
代码(关于这个稍微简化的问题)编译和运行良好,但在只读取和写入映射时输出字节数组的相应长度表明,每次序列化映射时,写入的字节数都比读取的字节数多,因此它的大小在增长(具体为17个字节)。。。?我不想最终得到一个包含一些字符串的映射,这些字符串需要2GB的磁盘空间,而且

我要将映射(从)反序列化到的列的数据类型是BLOB。 至少就我而言,所有资源在完成后都会关闭


有什么想法吗?非常感谢你的帮助

问题在于每次读取地图时,都要将其包装到一个新的SynchronizedSortedMap“包装器”中,然后将该包装器写入数据库。这样,下次阅读时,您将得到一个SynchronizedSortedMap,并用另一个SynchronizedSortedMap将其包装,实质上每次读写时都会添加一个包装


最简单的解决方案是确保您第一次编写SynchronizedSortedMap,然后在从数据库读取时不再进一步包装它。

问题是,每次读取地图时,您都将其包装到一个新的SynchronizedSortedMap“包装器”中,然后将该包装器写入数据库。这样,下次阅读时,您将得到一个SynchronizedSortedMap,并用另一个SynchronizedSortedMap将其包装,实质上每次读写时都会添加一个包装


最简单的解决方案是确保您在第一次编写SynchronizedSortedMap,然后在从数据库读取时不再进一步包装它。

感谢您向我指出这一点-我到现在还没有意识到这一点。我正在使用
SortedMap
作为类中相关字段的声明类型,现在可以正常工作了。再次感谢。感谢你向我指出这一点-我直到现在才意识到这一点。我正在使用
SortedMap
作为类中相关字段的声明类型,现在可以正常工作了。再次感谢。
this.categories = Collections.synchronizedSortedMap(map);
ObjectOutputStream oop = new ObjectOutputStream(os);
oop.writeObject(this.categories);
byte[] b = os.toByteArray();
is = new ByteArrayInputStream(b);
pst.setBinaryStream(2, is, b.length);
pst.executeUpdate();