gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:32 25 4
gpt4 key购买 nike

我有以下 JSON:

[
{
2: {
"c": true
}
},
{
3: {
"p": 10
}
}
]

我想转换成 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();
}

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

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

最佳答案

您已经收到了使用更新或更好的编码器的答案。但是对于后来来到这里的任何其他人......

问题是 OP 的编码器使用了无限长度的映射,然后使用“BREAK”基元来突破并转到下一个项目。

比较版本与 break 原语:

82             # array(2)
BF # map(*)
02 # unsigned(2)
BF # map(*)
61 # text(1)
63 # "c"
F5 # primitive(21)
FF # primitive(*)
FF # primitive(*)
BF # map(*)
03 # unsigned(3)
BF # map(*)
61 # text(1)
70 # "p"
0A # unsigned(10)
FF # primitive(*)
FF # primitive(*)

没有它们的版本:

82             # array(2)
A1 # map(1)
02 # unsigned(2)
A1 # map(1)
61 # text(1)
63 # "c"
F5 # primitive(21)
A1 # map(1)
03 # unsigned(3)
A1 # map(1)
61 # text(1)
70 # "p"
0A # unsigned(10)

您看到 map (*) 与 map (1) 了吗?

通过使用具有特定长度而不是不确定长度的 map ,生成的 CBOR 可以使用“一张 map 来了,这里是”而不是“IDK! map 来了!这是一个!现在停止!”

在第二个示例中,仍然有一个原语,但它不是 BREAK 命令。 0xF5 实际上意味着“真”。将前三位(CBOR 主要类型)从 0xF5 (11110101) 中取出,您将得到十进制 21,即已建立的 CBOR“真”(0x00010101)。

此外,将值 2 指定为其中包含“c”="true"的 map 的名称是完全有效的。但请注意,如果您担心将值用作名称时转换为 JSON 会出现问题。

这是一个糟糕的编码器问题,不应该使用无限长度的映射/中断。有时会使用这些,但仅限于“流”模式,这对于给出的示例来说不太可能。如果您预先拥有所有项目并进行编码,则不需要使用不定式。如果您有一定数量的映射但不确定有多少,并且想开始对您已有的进行编码,那么您将需要无限长度的映射或字符串。

关于java - 将固定大小的 Map 序列化为 CBOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com