【问题标题】:Efficient binary representation for Jackson TokenBufferJackson TokenBuffer 的高效二进制表示
【发布时间】:2025-12-16 18:45:01
【问题描述】:

如果我想在我的应用程序的两个实例之间传输 Jackson TokenBuffer,有没有一种有效的方法来序列化它? 特别是,我不关心使用的确切二进制格式,但我关心不重复保存密钥字符串。考虑,例如下面的例子:

List msg = new ArrayList();
for (int i = 0; i < 100; i++) {
  msg.add(new HashMap() {{
    put("asdfasdfasdf", i);
  }});
  // Doesn't necessarily have to be maps, could also be instances of some class
}
ObjectMapper om = new ObjectMapper();
TokenBuffer tb = new TokenBuffer()
om.writeValue(tb, msg);

现在,如果我只是使用一些典型的 JsonGenerator 来序列化给定的tb

JsonParser p = tb.asParse();
p.nextToken();
OutputStream bos = new ByteArrayOutputStream();
try (JsonGenerator generator = (new CBORFactory()).createGenerator(bos)) {
  generator.copyCurrentStructure(p);
}

字符串asdfasdfasdf 将在bos 中包含100 次。我能以某种方式避免这种情况吗? IE。对于某些支持重复映射键消除的二进制格式,是否有 JsonGenerator 的实例?

为了比较,如果我完成了(new Kryo()).writeClassAndObject(new Output(bos), msg),则字符串asdfasdfasdf 只会在二进制输出中包含一次。但是我已经有了tb,并且没有简单的方法可以返回msg,所以我想知道如何以一种时间和大小有效的方式序列化和传输tb

【问题讨论】:

    标签: java serialization jackson


    【解决方案1】:

    SmileFactory 会做我想做的事,只插入一次关键字符串。但是,我不相信它是我用例的最佳选择。似乎可以将auto-derived Avro 模式与流式 API 一起使用,从而产生更小的序列化值,但会显着增加 CPU 成本......

    【讨论】:

      最近更新 更多