如何在Rust中将结构体向量序列化和反序列化为TOML?
解决Rust中结构体向量的TOML序列化/反序列化问题
问题根源
TOML格式的根结构必须是一个表(Table),不支持直接将数组作为根元素。你直接序列化Vec<Point>作为根时,serde-toml生成的[[]]并非标准TOML语法,因此反序列化时会触发解析错误。
解决方案:用结构体包裹向量
将向量封装到一个结构体中,让结构体作为TOML的根表,向量作为结构体的字段,这样完全符合TOML规范,可正常完成序列化与反序列化。
修改后的代码示例:
use serde::{Deserialize, Serialize}; #[derive(PartialEq, Debug, Serialize, Deserialize)] struct Point { x: i32, } // 根结构体,包裹需要存储的向量 #[derive(PartialEq, Debug, Serialize, Deserialize)] struct PointsContainer { points: Vec<Point>, } fn main(){ let original = PointsContainer { points: vec![Point { x: 1 }, Point { x: 2 }], }; // 序列化TOML let toml = toml::to_string(&original).unwrap(); println!("生成的标准TOML:\n{}", toml); // 反序列化TOML let reconstructed: PointsContainer = toml::from_str(&toml).unwrap(); assert_eq!(original, reconstructed); }
生成的标准TOML格式
[[points]] x = 1 [[points]] x = 2
这里的[[points]]是TOML的**数组表(Array of Tables)**语法,每个[[points]]块对应向量中的一个Point实例,是TOML存储结构体数组的标准方式。
额外说明
如果确实需要避免外层结构体,也可以将数组放在TOML的某个表字段下,但TOML的根始终必须是一个表,不能直接是数组。
内容的提问来源于stack exchange,提问作者One
相关产品推荐
相关产品推荐

