如何将结构化数据保存到文件?

Sno*_*att 9 rust

我的程序包含大量具有恒定输出的预计算。我想避免在下次运行程序时运行此预计算。因此,我想在程序第一次运行时将其输出保存到文件中,并在下次运行程序时加载它。

输出包含我自己定义的非常见数据类型、对象和结构。

我该如何去做呢?

Kit*_*tsu 12

对 Rust 对象进行(反)序列化的事实上的标准方法是serde。给定一个 rust 结构(或枚举),它会生成一个中间表示,然后可以将其转换为所需的格式(例如 json)。给定一个结构:

use serde::{Serialize, Deserialize};

// here the "magic" conversion is generated
#[derive(Debug, Serialize, Deserialize)]
struct T {
    i: i32,
    f: f64,
}
Run Code Online (Sandbox Code Playgroud)

您可以使用简单的 oneliner 获得 json 表示形式:

let t = T { i: 1, f: 321.456 };
println!("{}", serde_json::to_string(&t).unwrap());
// prints `{"i":1,"f":321.456}`
Run Code Online (Sandbox Code Playgroud)

以及转换回来:

let t: T = serde_json::from_str(r#"{"i":1,"f":321.456}"#).unwrap();
println!("i: {}, f: {}", t.i, t.f);
// prints i: 1, f: 321.456
Run Code Online (Sandbox Code Playgroud)

是游乐场链接。这是serde_json用法的示例,但您可能会找到其他更合适的库,例如serde_sborserde_yamlbincodeserde_xml等等。


小智 5

您可能需要使用 serde 之类的工具序列化数据,将其保存到磁盘,然后在下次运行时从那里恢复它。特别是bincode对于以二进制格式序列化数据非常有用,它比 JSON 或其他人类可读格式节省更多空间。但是,如果您更改了程序中结构的布局,则必须小心不要使用旧的序列化数据。

为了更深入,我会去 Serde 的文档,但基本思想是标记所有需要保存的结构#[derive(Serialize, Deserialize)],并使用 bincode 进行序列化/反序列化。我使用的示例的Playground 链接serde_json(因为 bincode 在 rust Playground 中不可用),但bincode除了使用serializeand而不是anddeserialize之外没有什么不同。to_vecfrom_slice