将 serde 用于两种(反)序列化格式

Using serde for two (de)serialization formats

我已经成功使用serde_json反序列化和序列化JSON。我的设置看起来有点像这样(非常简单):

use serde::{Deserialize, Serialize};
use serde_json;
use serde_with::skip_serializing_none;

#[skip_serializing_none]
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
struct Foo {
    #[serde(flatten)]
    bar: Option<Bar>,
    
    baz_quux: Option<u8>,
}

#[skip_serializing_none]
#[derive(Deserialize, Serialize)]
struct Bar {
    #[serde(rename = "plughXyzzySomeRandomStuff")]
    plugh_xyzzy: Option<u8>
}

然后我在 Foo 上实现了 FromStrDisplay,它们又分别调用 serde_json::from_strserde_json::to_string,很容易 (de)序列化结构。

但是,我现在还想使用 serde_ini 来支持将 INI 文件(反)序列化为相同的 Rust 数据结构。但我真的不知道该怎么做。

结构本身很简单,但我的具体问题在于属性:

所以总而言之,我想我需要做的是重新实现这些属性,或者根据使用的 (De)Serializer 有条件地使用它们,但我不知道该怎么做。

这是serde设计的限制。 DeserializeSerialize 实现与 SerializerDeserializer 实现有意分开,这在选择不同格式和交换它们时提供了极大的灵活性和便利性。不幸的是,这意味着无法针对不同格式单独微调 DeserializeSerialize 实现。

我之前这样做的方法是复制数据类型,以便我可以为每种格式配置它们,然后提供它们之间的零成本转换。