【问题标题】:Cannot resolve T: serde::Deserialize<'a> when deriving Deserialize on a generic struct在泛型结构上派生反序列化时无法解析 T: serde::Deserialize<'a>
【发布时间】:2018-04-21 08:45:39
【问题描述】:

我正在尝试编写一个派生 serde::Deserialize 的结构,但它也有一个应该派生 serde::Deserialize 的字段:

extern crate serde;
#[macro_use]
extern crate serde_derive;

use serde::{Deserialize, Serialize};

#[derive(PartialEq, Serialize, Deserialize)]
pub struct Record<'a, T>
where
    T: 'a + Serialize + Deserialize<'a>,
{
    id: &'a str,
    created_at: &'a str,
    created_by: Option<&'a str>,
    last_updated_at: Option<&'a str>,
    object: &'a T,
}

impl<'a, T> Record<'a, T>
where
    T: 'a + Serialize + Deserialize<'a>,
{
    pub fn new(
        id: &'a str,
        created_at: &'a str,
        created_by: Option<&'a str>,
        last_updated_at: Option<&'a str>,
        object: &'a T,
    ) -> Self {
        Record {
            id,
            created_at,
            created_by,
            last_updated_at,
            object,
        }
    }
}

fn main() {}

我已经更改了一段时间的代码,但我无法编译这个想法。我目前遇到的错误是:

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

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    一般来说,you should not write Serde trait bounds on structs

    rustc --explain E0283 解释您的问题:

    当编译器没有足够的信息来明确选择实现时会发生此错误

    我发现使用#[serde(bound()] 声明边界可以编译示例:

    #[derive(PartialEq, Serialize, Deserialize)]
    pub struct Record<'a, T: 'a> {
        id: &'a str,
        created_at: &'a str,
        created_by: Option<&'a str>,
        last_updated_at: Option<&'a str>,
        #[serde(bound(deserialize = "&'a T: Deserialize<'de>"))]
        object: &'a T,
    }
    

    作为另一种解决方案,由于T 是通用的并且可能是参考,请考虑更改Record 定义,以便Serde 不需要更明确的指示:

    #[derive(PartialEq, Serialize, Deserialize)]
    pub struct Record<'a, T: 'a> {
        id: &'a str,
        created_at: &'a str,
        created_by: Option<&'a str>,
        last_updated_at: Option<&'a str>,
        object: T,
    }
    
    impl<'a, T: 'a> Record<'a, T> {
        pub fn new(
            id: &'a str,
            created_at: &'a str,
            created_by: Option<&'a str>,
            last_updated_at: Option<&'a str>,
            object: T,
        ) -> Self {
            Record {
                id,
                created_at,
                created_by,
                last_updated_at,
                object,
            }
        }
    }
    

    【讨论】:

    • 谢谢。我仍在尝试围绕 Rust 管理数据/内存的方式。我将从您的链接中学到很多东西。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2014-09-23
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多