【发布时间】:2021-11-15 14:41:13
【问题描述】:
如何在不使用 serde_json_core 或类似方法执行堆分配的情况下反序列化 JSON {"arr":[1,2,3,4]}?它当前执行一个分配。我看到 serde_json_core 使用 heapless 板条箱,但我不确定如何让它们一起工作。
#[derive(Deserialize)]
struct MyStruct {
arr: Vec<u64>,
}
fn main() {
let j = r#"{"arr":[1,2,3,4]}"#;
let r: serde_json_core::de::Result<(MyStruct, usize)> = serde_json_core::from_str(j);
let (out, _) = r.unwrap();
println!("First value: {}.", out.arr[0]);
}
我正在使用serde_json_core = 0.4.0。
【问题讨论】:
-
你事先知道数组的确切大小吗?如果是这样,您可以简单地反序列化为固定大小的数组
[u64; N]。如果没有,您需要确定您希望能够反序列化的最大可能数组大小。您需要预先分配堆栈上的所有内容,因此您不能支持任意大小。使用Vec不是一个选项,因为如果它包含任何元素,它将分配。 -
谢谢,我知道数组的长度必须小于或等于 10 个元素。不幸的是,如果我这样做
[u64; 10],我会得到'called 'Result::unwrap()' on an 'Err' value: CustomError'。我需要数组大小正好为 4 ([u64; 4]) 才能工作。 -
对于可变大小,不能使用固定大小的数组。您需要使用一些堆栈分配的类似矢量的数据结构,例如
heapless::Vec。您应该能够将use serde_json_core::heapless::Vec;添加到您的代码中,然后将10作为第二个模板参数添加到MyStruct内的Vec。 -
这是我在使用
serde_json_core时最初的希望,但是Deserialize特性并未针对heapless::Vec的所有变体实现:the trait 'Deserialize<'_>' is not implemented for 'serde_json_core::heapless ::Vec<u64, 4_usize>。我可以自己实现Deserialize以获得我想要的Vec容量,但希望我不必这样做。 -
您需要为
heapless启用serde功能才能获得实现。