由于枚举结构与 Serde Deserialize 的冲突要求,无法为生命周期参数“de”推断出合适的生命周期

cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements for struct made of enums with Serde Deserialize

为什么我可以为我的 WidgetValue 枚举自动派生 serde::Deserialize,但对于完全由 WidgetValue 字段组成的结构 不能

这对我来说似乎违反直觉。

编辑:出于各种原因,我正在使用 WidgetValue 枚举,因为我想通过具有相同类型签名的函数发送不同的值。见, How do I create a heterogeneous collection of objects?

serde = { version = "1.0.126", features = ["derive"] }
//works fine
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
    Integer32(i32),
    Unsized32(u32),
    CString(&'static str),
}

//lifetime error
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub struct DraggableInfo{
    parent: WidgetValue,
    index: WidgetValue,
    draggable_id: WidgetValue,
}

错误:

cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements

您可以修复生命周期错误,方法是在反序列化期间手动提供 'de 生命周期的界限。 由于 &'static str 枚举 WidgetValue 仅实现 Deserialize<'static> 因为没有其他生命周期可以借用 &'static str。这会导致 DraggableInfo 错误,因为默认情况下 'de 生命周期不受限制。通过本手册绑定,您声明 'de'static 更长寿,使它们相等。

#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
#[serde(bound(deserialize = "'de: 'static"))]
pub struct DraggableInfo{
    parent: WidgetValue,
    index: WidgetValue,
    draggable_id: WidgetValue,
}

#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
pub enum WidgetValue{
    Integer32(i32),
    Unsized32(u32),
    CString(&'static str),
}

不过您可能不想这样使用它,因为您只能从 'static 数据中得出。您可以像这样 CString(Cow<'static, str>) 重新定义 CString 以允许静态字符串文字和从非静态数据反序列化。