如何使用 `serde_json_core` 反序列化没有分配的数组?
How do I use `serde_json_core` to deserialise an array without allocations?
如何在不使用 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
。
serde-json-core
crate 可以将 JSON 数组反序列化为任何实现 Deserialize
特征的类型。如果你想避免内存分配,你需要选择一个不分配的容器。
如果事先知道数组的大小,可以简单地使用固定大小的数组,即[T; N]
。如果 JSON 数组的大小不完全 N
.
,这将 return 一个反序列化错误
如果 JSON 数组的大小是可变的且上限已知,您可以使用各种类似向量的堆栈分配数据结构之一。一个这样的选项是 heapless::Vec
,如果您为 heapless
启用 serde
功能,它会实现 Deserialize
。在您的 Cargo.yaml
文件中,您可以这样做:
heapless = { version = "0.7", features = ["serde"] }
如果您使用与您的 serde-json-core
版本相同的 heapless
版本,它只会包含在您的构建中一次。
如何在不使用 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
。
serde-json-core
crate 可以将 JSON 数组反序列化为任何实现 Deserialize
特征的类型。如果你想避免内存分配,你需要选择一个不分配的容器。
如果事先知道数组的大小,可以简单地使用固定大小的数组,即[T; N]
。如果 JSON 数组的大小不完全 N
.
如果 JSON 数组的大小是可变的且上限已知,您可以使用各种类似向量的堆栈分配数据结构之一。一个这样的选项是 heapless::Vec
,如果您为 heapless
启用 serde
功能,它会实现 Deserialize
。在您的 Cargo.yaml
文件中,您可以这样做:
heapless = { version = "0.7", features = ["serde"] }
如果您使用与您的 serde-json-core
版本相同的 heapless
版本,它只会包含在您的构建中一次。