反序列化使用调试特征格式编写的向量

Spl*_*nes 2 rust deserialization

给定一个简单的向量向量,我可以利用实现该特征的usize事实,因此使用格式化程序来漂亮地打印它(请参阅游乐场):VecDebug{:?}

let mut hierarchy: Vec<Vec<usize>> = Vec::new();
hierarchy.push(vec![0,1,2,3]);
hierarchy.push(vec![0,1]);
println!("Hierarchy: {:?}", hierarchy);
Run Code Online (Sandbox Code Playgroud)

假设我将 的输出写入println!(...)文件。以后如何轻松反序列化它?

例如我的文件如下所示:

[[0,1,2,3],[0,1]]
Run Code Online (Sandbox Code Playgroud)

使用serde,我可以序列化我的数据类型并将其存储为(例如)JSON 文件。但是,我不需要任何“花哨”的数据格式,只需要这种简单的向量向量。是否有任何简单的解决方案可以根据Debug特征进行反序列化(“反转打印”)?是否有比手动执行所有解析器逻辑更简单的选择,例如逐字符读取文件以查找[,],

Kev*_*eid 5

请勿将此Debug特征用于此目的。它不保证它是可解析的,或者它对任何目的都有用。

\n
\n

派生Debug格式不稳定,因此可能会随着未来的 Rust 版本而改变。此外,Debug标准库提供的类型的实现(stdcorealloc等)并不稳定,也可能随着未来的 Rust 版本而改变。

\n
\n

\xe2\x80\x94std::fmt::Debug特征文档

\n

例如,有人建议使用一个编译选项,该选项根本Debug不打印任何内容,以避免在优先考虑代码大小时生成格式化代码。这可能会发生,也可能不会发生,但它是允许发生的;(不幸的是,我找不到我记得的最近一个链接;这是一个较旧的链接。)

\n
\n

serde_json是解决这个问题的一个完美的方法:

\n
fn main() {\n    let mut hierarchy: Vec<Vec<usize>> = Vec::new();\n    hierarchy.push(vec![0, 1, 2, 3]);\n    hierarchy.push(vec![0, 1]);\n    serde_json::to_writer(std::io::stdout(), &hierarchy).unwrap();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

将打印[[0,1,2,3],[0,1]]. 您不需要任何设置。

\n

如果您关心使用更多类似 Rust 的语法,您可以使用ron,一个使用类似 Rust 表示法的通用序列化器;或者uneval生成实际的 Rust 代码,但您需要一个 Rust 编译器来“反序列化”它。

\n