MCPcopy Index your code
hub / github.com/dtolnay/serde-stacker

github.com/dtolnay/serde-stacker @0.1.14

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.1.14 ↗ · + Follow
137 symbols 157 edges 5 files 4 documented · 3% updated 13d ago0.1.14 · 2025-09-15★ 373 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Serde stack growth adapter

github crates.io docs.rs build status

This crate provides a Serde adapter that avoids stack overflow by dynamically growing the stack.

Be aware that you may need to protect against other recursive operations outside of serialization and deserialization when working with deeply nested data, including, but not limited to, Display and Debug and Drop impls.

[dependencies]
serde = "1.0"
serde_stacker = "0.1"

Deserialization example

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);
        }
    }
}

Serialization example

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);
        }
    }
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Core symbols most depended-on inside this repo

serialize
called by 1
src/ser.rs
new
called by 0
src/ser.rs
serialize_bool
called by 0
src/ser.rs
serialize_i8
called by 0
src/ser.rs
serialize_i16
called by 0
src/ser.rs
serialize_i32
called by 0
src/ser.rs
serialize_i64
called by 0
src/ser.rs
serialize_i128
called by 0
src/ser.rs

Shape

Method 116
Class 18
Function 3

Languages

Rust100%

Modules by API surface

src/de.rs78 symbols
src/ser.rs53 symbols
tests/test.rs3 symbols
src/param.rs3 symbols

For agents

$ claude mcp add serde-stacker \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact