我的程序包含一个庞大的预计算和恒定的输出。我想避免在下一次运行程序时运行这个预计算。因此,我希望将它的输出保存为程序的第一次运行时的文件,并在下次运行程序时加载它。
输出包含我自己定义的非公共数据类型、对象和结构。
我该怎么做呢?
发布于 2020-07-07 09:15:47
一种用于(去)序列化生锈对象的事实上的标准方法是塞德。给定锈蚀结构(或枚举),它产生中间表示,然后可以将其转换为所需的格式(例如,json)。给出一个结构:
use serde::{Serialize, Deserialize};
// here the "magic" conversion is generated
#[derive(Debug, Serialize, Deserialize)]
struct T {
i: i32,
f: f64,
}您可以使用简单的oneliner来获得json表示:
let t = T { i: 1, f: 321.456 };
println!("{}", serde_json::to_string(&t).unwrap());
// prints `{"i":1,"f":321.456}`以及转换回:
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这里是一个操场链接。这是json使用的一个例子,但您可能会发现其他更合适的库,如斯博尔、yaml、联码、xml和许多其他库。
发布于 2020-07-07 09:30:23
您可能希望使用类似塞德的方法来序列化数据,将其保存到磁盘,然后在下一次运行时从那里恢复数据。特别是,联码用于序列化二进制格式的数据,这比JSON或其他人类可读的格式节省了更多的空间。但是,如果更改了程序中结构的布局,则必须小心不要使用旧的序列化数据。
为了更深入地了解,我将访问Serde的文档,但基本思想是用#[derive(Serialize, Deserialize)]标记所有需要保存的结构,并使用二进制代码进行序列化/反序列化。例如,我用操场链接编写了一个serde_json (作为二进制代码在生锈操场上不可用),但是bincode没有什么不同,除了使用serialize和deserialize,而不是to_vec和from_slice。
https://stackoverflow.com/questions/62771576
复制相似问题