如何反序列化经Debug trait格式化的Vec<Vec<usize>>?
解决方案
当然有不用手动逐字符解析的简便方案,下面给你两个实用的思路:
- 用
syncrate解析:Vec通过{:?}输出的格式,和Rust的嵌套数组字面量语法几乎完全一致,而syn本来就是用来解析Rust代码结构的工具,刚好能派上用场。示例代码如下:
use syn::{parse_macro_input, ExprArray}; use std::fs; fn main() -> Result<(), Box<dyn std::error::Error>> { // 读取文件内容 let content = fs::read_to_string("data.txt")?; // 用syn解析外层数组 let outer_array = parse_macro_input!(content as ExprArray); let mut result = Vec::new(); for inner_expr in outer_array.elems { // 解析内层每个数组 let inner_array = parse_macro_input!(inner_expr as ExprArray); let mut inner_vec = Vec::new(); for num_expr in inner_array.elems { // 把每个数字字面量转换成usize let num_lit = parse_macro_input!(num_expr as syn::LitInt); inner_vec.push(num_lit.base10_parse()?); } result.push(inner_vec); } println!("解析结果: {:?}", result); Ok(()) }
- 用
debug_parsercrate直接解析Debug输出:这个 crate 是专门针对Rust的Debugtrait输出格式做的解析工具,用法更简洁,不需要关心Rust语法细节:
use debug_parser::DebugParser; use std::fs; fn main() -> Result<(), Box<dyn std::error::Error>> { let content = fs::read_to_string("data.txt")?; // 直接把字符串解析成目标类型 let parsed_vec: Vec<Vec<usize>> = DebugParser::parse(&content)?; println!("解析结果: {:?}", parsed_vec); Ok(()) }
这两个方案都不需要自己写逐字符的解析逻辑,直接依赖现成的工具库就能完成反序列化。
内容的提问来源于stack exchange,提问作者Splines
相关产品推荐
相关产品推荐

