将 serde_xml_rs 与枚举一起使用时找不到匹配项
Failing to find a match when using serde_xml_rs with enums
我正在尝试使用 serde_xml_rs 反序列化 XML 块,但出于某种原因,它似乎无法识别并将结果映射到我的枚举上。这是代码:
#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum Type {
#[serde(rename = "string")]
StringFieldEmpty,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct DataType {
name: String,
description: String,
#[serde(rename = "$value")]
dtype: Type,
}
// Code to test with
let basic_test = r#"
<dataType name="My object">
<description>
Describes my object.
</description>
<string>
</string>
</dataType>
"#;
let data_basic_type: DataType = from_str(basic_test).unwrap();
与“string”不同的数据类型,甚至“string”类型也会有像 maxLength=69 这样的元素,所以这里非常需要枚举。
我收到错误...
panicked at 'called `Result::unwrap()` on an `Err` value: Custom { field: "unknown variant `description`, expected `string`" }
非常感谢任何解决此问题的建议。
我想我破解了这个。首先,迁移到 quick_xml 有助于推进解决方案,因为它更宽松(rename = "string" 开始工作)。然而,真正的问题在于 serde 不能依赖顺序,因此 $value 会尝试获取任何字段(在这种情况下 description) 而不仅仅是 string 需要一个解决方案,我可以在其中定义适用的键。
使用重命名和别名标签的组合为我解决了这个问题。以下是主要变化...
#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum Type {
#[serde(rename = "string")]
StringField(StringType),
#[serde(rename = "unsignedInt")]
UnsignedInt,
#[serde(rename = "unsignedLong")]
UnsignedLong,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct DataType {
name: String,
base: Option<String>,
description: String,
#[serde(rename = "string")]
#[serde(alias = "unsignedInt")]
#[serde(alias = "unsignedLong")]
dtype: Type,
}
我正在尝试使用 serde_xml_rs 反序列化 XML 块,但出于某种原因,它似乎无法识别并将结果映射到我的枚举上。这是代码:
#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum Type {
#[serde(rename = "string")]
StringFieldEmpty,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct DataType {
name: String,
description: String,
#[serde(rename = "$value")]
dtype: Type,
}
// Code to test with
let basic_test = r#"
<dataType name="My object">
<description>
Describes my object.
</description>
<string>
</string>
</dataType>
"#;
let data_basic_type: DataType = from_str(basic_test).unwrap();
与“string”不同的数据类型,甚至“string”类型也会有像 maxLength=69 这样的元素,所以这里非常需要枚举。
我收到错误...
panicked at 'called `Result::unwrap()` on an `Err` value: Custom { field: "unknown variant `description`, expected `string`" }
非常感谢任何解决此问题的建议。
我想我破解了这个。首先,迁移到 quick_xml 有助于推进解决方案,因为它更宽松(rename = "string" 开始工作)。然而,真正的问题在于 serde 不能依赖顺序,因此 $value 会尝试获取任何字段(在这种情况下 description) 而不仅仅是 string 需要一个解决方案,我可以在其中定义适用的键。
使用重命名和别名标签的组合为我解决了这个问题。以下是主要变化...
#[derive(Debug, Serialize, Deserialize, PartialEq)]
enum Type {
#[serde(rename = "string")]
StringField(StringType),
#[serde(rename = "unsignedInt")]
UnsignedInt,
#[serde(rename = "unsignedLong")]
UnsignedLong,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct DataType {
name: String,
base: Option<String>,
description: String,
#[serde(rename = "string")]
#[serde(alias = "unsignedInt")]
#[serde(alias = "unsignedLong")]
dtype: Type,
}