使用 Serialize 和 DeserializeOwned 作为超级特征时无法解析 `T: serde::Deserialize<'de>`

Mar*_*ark 4 traits rust serde

我希望我的特质取决于 Serde 的特质:

pub trait MyTrait: Serialize + DeserializeOwned {}

#[derive(Serialize, Deserialize)]
pub struct MyStruct<T: MyTrait> {
    value: T,
}

impl MyTrait for i32 {}
impl MyTrait for MyStruct<i32> {}
Run Code Online (Sandbox Code Playgroud)

完整代码

但我收到这个错误:

pub trait MyTrait: Serialize + DeserializeOwned {}

#[derive(Serialize, Deserialize)]
pub struct MyStruct<T: MyTrait> {
    value: T,
}

impl MyTrait for i32 {}
impl MyTrait for MyStruct<i32> {}
Run Code Online (Sandbox Code Playgroud)

我不知道这在这种情况下意味着什么。我不明白它与有关 E0283 的信息有何关系。

(我认为DeserializeOwned就是我想要的基于Serde 生命周期信息,但我找不到任何有关“扩展”特征的信息,所以我可能是错的)。

Pet*_*all 6

一般来说,避免对struct. 相反,将边界放在impl需要这些边界的方法块上:

#[derive(Serialize, Deserialize)]
pub struct MyStruct<T> {
    value: T,
}

impl<T> MyStruct<T> where T: MyTrait {
    fn do_stuff(&self) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

struct解决块与块的约束的方式之间的差异impl有点微妙,但足以说明它是不同的,并且此更改应该使您的代码按预期工作。