我得到了一个Vec<u8> in的代码,我想用reqwest发送给json.这行代码给我的输出大约是400,其中contentVec<u8>:content.len().我怀疑使用serde_json时使用的字节数是相同的,但是当我使用下面的代码时,使用的字节数是原来的三倍:

serde_json::to_value(content).to_string().to_bytes().len()

这给出了大约1200.我也试着切换到serde_bytes,但结果是一样的.当我将它编码为Base64时,输出是500,所以开销很小,但还可以.将Value解码回Vec<u8>是一件很痛苦的事情,看起来开销来自serde_json将所有内容都编码为u64的事实.

上下文:我调用的端点对我可以发送的字节有严格的限制,这就是为什么我要事先进行计算,通过计算端点将收到的字节数来省略调用该端点的错误.如果计算字节的方法不正确,我也想知道.

推荐答案

JSON必须是Unicode文本,因此通常不可能在不进行编码的情况下发送任意字节字符串.默认情况下,serde_json将该数据编码为字节数组,正如您已经注意到的,效率不是很高.

当然可以使用Base64,在这种情况下,输入的字节数N将占用(Floor((N+2)/3)*4)个字节.如果您的数据可能主要是ASCII,如Unix文件名,您可以使用类似百分比编码的形式(即,%变成%25,控制字符和大于127的字符变成%NN,而ASCII非控制字符保持不变).文本的扩展程度取决于您使用的字节序列.

如果您控制目标端点,则可以考虑改用CBOR.它在很多方面很像JSON,但它是二进制的,它可以有效地编码字节和文本字符串,以及JSON支持的所有其他数据类型(甚至更多).它肯定会大大减少数据的扩展,因为字节串是按原样序列化的,只有一个很小的前缀.

Rust相关问答推荐

go 掉包装 struct 中的泛型

如何装箱生命周期相关联的两个对象?

如何仅使用http机箱发送http请求?

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

一种随机局部搜索算法的基准(分数)

类型批注需要静态生存期

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

try 创建随机数以常量

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

Rust typestate 模式:实现多个状态?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

从光标位置旋转精灵

为什么要这样编译?

类型判断模式匹配panic

在 FFI 的上下文中,未初始化是什么意思?

如何构建包含本地依赖项的 docker 镜像?

返回 &str 但不是 String 时,borrow 时间比预期长