我已成功使用
然后我在
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
上实现了FromStr
和Display
,它们分别调用serde_json::from_str
和serde_json::to_string
,以便轻松(反)序列化结构体。
然而,我现在想使用serde_ini
来支持(反)序列化INI文件到同一Rust数据结构。但我实在搞不清楚该怎么做。
结构本身很简单,但我的具体问题在于属性:
- JSON和INI格式中的键名不同(JSON格式使用传统的驼峰命名法,而INI则不是),因此我必须以其他方式解决
#[serde(rename)]
和#[serde(rename_all)]
属性的问题,但我不确定在哪里或如何解决。 #[serde(flatten)]
与serde_ini
的所有字符串值似乎不兼容,这些值需要一个#[serde(deserialize_with="from_str)]"
属性来处理所有非字符串值,但这显然只适用于INI值而不是JSON值。
总之,我想要做的就是重新实现这些属性,或根据使用的(De)Serializer有条件地使用它们,但我不知道该如何做到。
#[serde(alias)]
可以用于从多种格式反序列化,但不能用于序列化。 - tobiasvlSerialize
中。具体可以参考 https://github.com/serde-rs/serde/pull/2005#pullrequestreview-617070896。 - eggyal