在使用 GZipOutputStream 将 TreeSet 对象压缩到 byte[] 数组中时,我遇到了一个奇怪的 StackOverflowError。
执行压缩的代码非常标准:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream zip = new GZIPOutputStream(baos);
ObjectOutputStream oos = new ObjectOutputStream(new BuifferedOutputStream(zip));
oos.writeObject(this);
oos.close();
zip.close();
baos.close();
TreeSet 对象包含数据对象的集合,这些对象中的字段是平面的,即没有映射/列表/集合(它们可能有一些集合字段,但由于 TreeSet 被压缩,它们是空的),只有数字、布尔值和字符串。
我在一些帖子中读到 GZIPOutputStream 在处理复杂的地图结构时会遇到这个问题,但没有更多细节。
有谁知道什么样的地图会因为这种堆栈溢出错误而破坏 GZIP?我正在压缩的 TreeSets 也特别大......错误偶尔出现,我无法自行生成它,它只会在生产中运行时发生,当这些 TreeSets 被积极使用时(读取、添加和拉链)。