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

How to deserialize two different structures and file formats using toml-rs and serde_derive?

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

我的第一个数据结构与一个包含必填字段和可选字段的 TOML 文件定义相对应。

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

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

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

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

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

将使用 FooDeserialize 实现。

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

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

Also, related - is it possible to put the type into the file itself, so that deserialization can be more generic, and the deserializer can detect the type to deserialize from the file itself?

你可以用枚举来做到这一点。每个变体可以包含不同的类型。为了找出确切的设计,我建议您为枚举实现 Serialize,将其序列化为您的目标格式,然后您将了解如何执行运行时类型规范。我不确定 toml 是否支持枚举,但 json 肯定支持。