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

时间:2018-07-22 11:34:17

标签: rust traits 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> {}

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的关系。

(我认为基于Serde lifetimes info,我想要DeserializeOwned,但是由于“扩展”特征我什么都找不到,所以我可能错了)。

1 个答案:

答案 0 :(得分:3)

通常为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块的约束求解方式上的差异有些微妙,但可以说是不同的,这种改变应可使您的代码按预期工作。