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

Cannot resolve `T: serde::Deserialize<'de>` when using Serialize and DeserializeOwned as supertraits

我希望我的特性取决于 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> {}

(full code)

但是我得到这个错误:

error[E0283]: type annotations required: cannot resolve `T: serde::Deserialize<'de>`
  --> src/main.rs:11:21
   |
11 | #[derive(Serialize, Deserialize)]
   |                     ^^^^^^^^^^^
   |
   = note: required by `serde::Deserialize`

我不知道在这种情况下这意味着什么。我不明白它与 info about E0283.

有什么关系

(我 认为 DeserializeOwned 是我想要的,基于 Serde lifetimes info,但我在 "extending" 上找不到任何东西特质,所以我可能是错的)。

一般来说,avoid putting trait bounds on a struct。相反,为需要这些边界的方法将边界放在 impl 块上:

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

impl<T> MyStruct<T> where T: MyTrait {
    fn do_stuff(&self) {
        ...
    }
}

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