#stack-overflow #serde #serialization #adapter #recursion #dynamically #nested

serde_stacker

Serde适配器,通过动态增长栈来避免栈溢出

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编码

Download history 6840/week @ 2024-03-14 8941/week @ 2024-03-21 7843/week @ 2024-03-28 6695/week @ 2024-04-04 6672/week @ 2024-04-11 7706/week @ 2024-04-18 8152/week @ 2024-04-25 7095/week @ 2024-05-02 6263/week @ 2024-05-09 6375/week @ 2024-05-16 5972/week @ 2024-05-23 9261/week @ 2024-05-30 8636/week @ 2024-06-06 7607/week @ 2024-06-13 9290/week @ 2024-06-20 6843/week @ 2024-06-27

34,035 每月下载量
用于 28 个crate(直接使用17个)

MIT/Apache

43KB
1K SLoC

Serde栈增长适配器

github crates.io docs.rs build status

此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.0MIT许可证
除非您明确声明,否则您有意提交的任何贡献,根据Apache-2.0许可证定义,都应双重许可如上所述,无需任何额外条款或条件。

依赖关系

~0.2–0.8MB
~14K SLoC