如何使用toml-rs和serde_derive反序列化两种不同的结构和文件格式?

时间:2017-11-22 08:23:54

标签: rust serde toml

我正在使用toml-rs和serde_derive反序列化我的应用程序用来描述数据结构的TOML文件。

我的所有内容都与我的第一个数据结构一致,它对应于一个带有必填字段和可选字段的TOML文件定义。

现在我想使用它来反序列化另一个TOML文件中描述的具有不同字段的数据结构。

如何指定反序列化器(我正在使用toml::from_str(&contents))我要反序列化的结构类型?

相关问题 - 是否可以将类型放入文件本身,以便反序列化可以更通用,反序列化器可以检测从文件本身反序列化的类型?

1 个答案:

答案 0 :(得分:3)

toml::from_str反序列化为表达式所期望的类型。所以

let x: Foo = toml::from_str(something)?;

将使用Deserialize的{​​{1}} impl。

您还可以通过泛型参数显式指定要反序列化的类型:

Foo
  

此外,相关 - 是否可以将类型放入文件本身,以便反序列化可以更通用,并且反序列化器可以检测从文件本身反序列化的类型?

你可以用枚举来做到这一点。每个变体可以包含不同的类型。为了弄清楚确切的设计,我建议您为枚举实现let x = toml::from_str::<Foo>(something)?; ,将其序列化为目标格式,然后您将看到如何执行运行时类型规范。我不确定Serialize是否支持枚举,但json确实支持枚举。