【发布时间】:2020-04-13 14:45:21
【问题描述】:
我想要这样的东西:
#[derive(Debug, Serialize, Deserialize)]
struct MyStruct {
field1: String,
field2: Option<u64>,
#[serde(tag(value = "tag_value"))]
tag: ()
}
#[serde(tag(value = "tag_value"))] 不是 Serde 提供的实际属性,它在这里只是为了表达一个想法。我知道我可以自己完成所有的序列化,使用远程,(de)serialize_with 等,但是这些需要大量的样板代码。
思路是标签字段必须存在,MyStruct序列化为JSON应该是:
{
"field1": "foo",
"field2": 42,
"tag": "tag_value"
}
如果“tag”字段丢失或映射到与“tag_value”不同的值,则反序列化必须失败。
【问题讨论】:
-
您能更好地解释一下您所说的“假”字段是什么意思吗?那该怎么办?它适用于序列化,或反序列化,或两者兼而有之?您是否尝试过创建这样的样板?
-
听起来您正在尝试重新实现枚举。具体来说,您有类似 internally-tagged enum 的东西。
-
@Shepmaster 不完全是。枚举不能从模块外部扩展,当所有可能的变体混合在一起时,我似乎很难提取有用的错误。