将固定大小的 Map 序列化为 CBOR

Bib*_*ibu 5 java serialization json jackson cbor

我有以下 JSON:

[
  {
    2: {
      "c": true
    }
  },
  {
    3: {
      "p": 10
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我想转换为 CBOR 格式。根据 cbor.me 我有以下输出:

82A102A16163F5A103A161700A

但是,当使用 Jackson Binary CBOR Serializer 时,我有以下输出:

82BF02BF6163F5FFFFBF03BF61700AFFFF

这并没有错,但没有优化......我有额外的 4 个不必要的字节添加到它真正可能的位置。

然后我尝试手动序列化 JSON 但结果相同:

@Override
public void serialize(Request value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
    jgen.writeStartArray(value.getDataList().size());
    for (Data data : value.getDataList()) {
        jgen.writeStartObject(new Map[1]);
        jgen.writeFieldId(data.getItem());
        jgen.writeStartObject();
        if (data.getObject().getC() != null) {
            jgen.writeBooleanField("c", data.getObject().getC());
        }
        if (data.getObject().getP() != null) {
            jgen.writeNumberField("p", data.getObject().getP());
        }
        jgen.writeEndObject();
        jgen.writeEndObject();
    }
    jgen.writeEndArray();
}
Run Code Online (Sandbox Code Playgroud)

这是 Jackson 二进制格式库的错误还是我缺少 ObjectMapper 的一些配置属性?

编辑:这似乎是一个已知问题:https : //github.com/FasterXML/jackson-dataformats-binary/issues/3

Bib*_*ibu 0

通过使用版本,类2.9.4中可以使用以下方法CBORGeneratorpublic final void writeStartObject(int elementsToWrite)

@Override
public void serialize(Request value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
    jgen.writeStartArray(value.getDataList().size());
    for (Data data : value.getDataList()) {
        ((CBORGenerator) jgen).writeStartObject(1);
        jgen.writeFieldId(data.getItem());
        ((CBORGenerator) jgen).writeStartObject(1);
        if (data.getObject().getC() != null) {
            jgen.writeBooleanField("c", data.getObject().getC());
        }
        if (data.getObject().getP() != null) {
            jgen.writeNumberField("p", data.getObject().getP());
        }
        jgen.writeEndObject();
        jgen.writeEndObject();
    }
    jgen.writeEndArray();
}
Run Code Online (Sandbox Code Playgroud)

我有以下输出:

82A102A16163F5A103A161700A