将 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,
}