You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:50:26