问题标签 [bincode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - 使用 Sled,我如何序列化和反序列化?
我正在使用 crate sled并尝试使用bincode进行简单的序列化和反序列化练习,只是为了掌握使用情况。
虽然我可以让插入工作,但尝试获得一系列结果似乎更加困难。在这里,我尝试输入两条记录:值为“Alice”的 42 键和值为“Bob”的 69 键,然后检索并打印它们。我很难协调向量的反序列化出来:
尝试使用我拼凑的控制台条目侦听器与之交互,我得到以下输出:
这发生在尝试反序列化(或值String
或i64
值。有趣的是,输出似乎表明 sled 或 bincode 正在截断键值。
sled 使用的示例似乎并没有解决检索值的问题,但是通过查看一些文档和部分源代码,我感觉 serde 序列化是一种让东西进出 sled 的有效方式。
serialization - 将未知 JSON 序列化和反序列化为二进制
我正在编写一个将 json 对象作为输入的微服务。这个 json 对象只是部分已知的,因此我映射到的结构如下所示:
然后我想将其发布到 RabbitMQ 队列,因此我使用以下命令对其进行序列化bincode
:
接收服务(消费者)无法反序列化它(即使它具有完全相同的模型)并导致Err(DeserializeAnyNotSupported)
.
据我了解,这来自serde_json::Value
结构的 - 部分。那么如何将部分未知的 JSON 对象序列化为二进制,以便在接收服务上对其进行反序列化呢?
rust - serde 跳过属性实际上会跳过枚举变体吗?
我有一个像这样的枚举:
然后我尝试使用bincode crate 执行以下操作:
但是,这会因以下消息而恐慌:
我注意到,如果满足以下条件之一,一切正常:
- 我删除
#[serde(skip)]
属性 - 我从变体中删除元组
我也知道 bincode 以某种方式忽略#[serde(skip)]
并尝试反序列encoded
化为E::D(Vec<i32>)
. 如果我改变Vec<i32>
它char
会起作用,但decoded
会E::D('A')
(而不是E::C('A')
)。
我错过了什么,还是 bincode crate 中的错误?
serialization - Rust bincode enum 二进制序列化
我对 Rust 相当陌生,并且在我的项目中使用 bincode。枚举变体的编码是我在与现有服务器交互时一直试图处理的一个问题。旧项目是用 C 语言编写的,并定义了“fshort-enums”的编译器选项。
在旧的 C 项目中,我会定义一个类似的枚举:
然后当这个数据被放入数据包时,它将占用 1 个字节,如下所示:
如果我将枚举定义为:
然后当这个数据被放入数据包时,每个变体都会占用 2 个字节,如下所示:
现在我找到了一种方法来配置bincode
枚举编码以从默认的 4 个字节更改为适合以下值的大小:
问题1:如何强制bincode
使所有变体占用2个字节?
问题2:如何强制bincode
应用枚举变量值?(在此示例TestEnum::Complete
中,值为 2 而不是 65535)。
rust - 结构的保存/加载工作或失败取决于成员向量长度
我使用 serde 和 bincode 使用自定义加载/保存方法定义了以下结构:
现在奇怪的是,下面的测试告诉我,如果 vec(直方图的成员)的长度很小,保存/加载可以正常工作,但它失败了(我没有收到任何错误,只是生成的直方图实例是错误)具有较大的值,例如 10000000。确切地说,我从那里得到的值 5263431 不再正确。
任何想法出了什么问题?
rust - 让 serde 只为人类可读的序列化程序生成十六进制字符串?
我目前正在使用serde-hex。
失败:
因为它已将值扩展为二进制码的十六进制字符串。
我有许多需要用 serde_json 和 bincode 序列化的结构。 serde_hex
正是我需要的 JSON 序列化。当使用 bincode serde-hex 时,仍然将数组转换为十六进制字符串,这是不想要的。
我注意到secp256k1 使用d.is_human_readable()
.
我怎样才能使serde_hex
仅适用于serde_json
并被忽略bincode
?
rust - serde/bincode 如何序列化字节数组?
这段代码完全按照我的意愿序列化一个 32 字节的数组:
它是如何工作的?
根据https://serde.rs/impl-serializer.html有一个serialize_bytes()
函数,但是 bincode 版本在数据前面加上了一个长度。
代码(进一步在上面)调用序列化中的什么函数,将 32 个字节序列化为没有长度前缀的自身?
上下文:我正在为一种类型实现客户序列化,并且我希望它(在某些情况下)序列化字节数组,以便 bincode 将它们编码为没有长度前缀的字节。这是一个问题,因为调用serialize_bytes()
添加了长度前缀。
我想了解默认情况下如何序列化字节数组,因为我不知道要调用哪个方法来代替serialize_bytes()
获取没有长度前缀的字节。
rust - 如果我将数据反序列化为错误的类型,为什么 bincode 检测不到错误?
当我尝试将二进制数据反序列化为错误类型时,为什么我不会从 bincode 中收到错误消息?
我期待得到一个Message::Ping
,但我得到:
rust - Serde bincode 自定义反序列化方案
我正在尝试使用serde
和bincode
crates 为特定结构实现高级序列化/反序列化方案。为了演示,以下代码有效:
输出:
但是,我想以更压缩的格式序列化数据。不应该有明确的标签来标识数据包含哪个变体,而是我希望它从相应的字节派生;如果字节小于 100 则为 Element Vec<u8>
,否则为 Command u8
。我试过这样#[serde(untagged)]
设置Command
我得到以下输出:
第一次打印是正确的,但我不确定如何实现如上所述的反序列化。
rust - 反序列化 Vec非标准长度编码
我正在尝试将 serde 与 bincode 一起使用来反序列化任意比特币网络消息。鉴于有效负载普遍作为字节数组处理,当在编译时长度未知时如何反序列化它?bincode
默认情况下Vec<u8>
,假设它的长度被编码为u64
向量元素之前的处理。然而,这个假设在这里不成立,因为校验和出现在有效载荷的长度之后。
我有以下工作解决方案
货运.toml
main.rs
输出:
我不喜欢这个解决方案,因为它的payload
处理方式。它需要我分配一些“足够大”的缓冲区来考虑 的动态大小payload
,在代码片段中 5000 以上就足够了。我宁愿反序列payload
化为单个元素并使用它deserializer.deserialize_tuple(5, MessageVisitor)
。
有没有办法以简洁的方式处理这种反序列化?
我可以找到类似的问题:我可以用 Bincode 反序列化具有可变长度前缀的向量吗?