12个版本
0.1.11 | 2024年1月2日 |
---|---|
0.1.10 | 2023年7月15日 |
0.1.8 | 2023年3月3日 |
0.1.7 | 2022年12月17日 |
0.1.0 | 2019年1月13日 |
#1000 在 编码
34,035 每月下载量
用于 28 个crate(直接使用17个)
43KB
1K SLoC
Serde栈增长适配器
此crate提供了一个Serde适配器,通过动态增长栈来避免栈溢出。
请注意,当处理深层嵌套数据时,您可能需要保护序列化和反序列化之外的递归操作,包括但不限于Display和Debug以及Drop实现。
[dependencies]
serde = "1.0"
serde_stacker = "0.1"
反序列化示例
use serde::Deserialize;
use serde_json::Value;
fn main() {
let mut json = String::new();
for _ in 0..10000 {
json = format!("[{}]", json);
}
let mut deserializer = serde_json::Deserializer::from_str(&json);
deserializer.disable_recursion_limit();
let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
let value = Value::deserialize(deserializer).unwrap();
carefully_drop_nested_arrays(value);
}
fn carefully_drop_nested_arrays(value: Value) {
let mut stack = vec![value];
while let Some(value) = stack.pop() {
if let Value::Array(array) = value {
stack.extend(array);
}
}
}
序列化示例
use serde::Serialize;
use serde_json::Value;
fn main() {
let mut value = Value::Null;
for _ in 0..10000 {
value = Value::Array(vec![value]);
}
let mut out = Vec::new();
let mut serializer = serde_json::Serializer::new(&mut out);
let serializer = serde_stacker::Serializer::new(&mut serializer);
let result = value.serialize(serializer);
carefully_drop_nested_arrays(value);
result.unwrap();
assert_eq!(out.len(), 10000 + "null".len() + 10000);
}
fn carefully_drop_nested_arrays(value: Value) {
let mut stack = vec![value];
while let Some(value) = stack.pop() {
if let Value::Array(array) = value {
stack.extend(array);
}
}
}
许可证
根据您的选择,许可协议为Apache许可证,版本2.0或MIT许可证。除非您明确声明,否则您有意提交的任何贡献,根据Apache-2.0许可证定义,都应双重许可如上所述,无需任何额外条款或条件。
依赖关系
~0.2–0.8MB
~14K SLoC