【问题标题】:Rocket Deserialize 'de lifetimeRocket Deserialize 'de lifetime
【发布时间】:2023-02-20 21:44:11
【问题描述】:

我是 Rust 的新手,正在努力学习。我正在使用 Rocket 创建一个传递一些键/值对的 API 端点。我已经这样定义了我的结构:

#[derive(Deserialize)]
#[serde(crate = "rocket::serde")]
#[derive(Debug)]
struct PostDocument<'r> {
    fields: Vec<FieldValues<'r>>
}

#[derive(Deserialize)]
#[serde(crate = "rocket::serde")]
#[derive(Debug)]
struct FieldValues<'r> {
    name: &'r str,
    value: &'r str,
}

并在这样的 API 端点中使用它们:

#[post("/<index_name>", format="json", data="<message>")]
async fn new_document(message: Json<PostDocument<'_>>, index_name: &str) -> Json<AddDocumentResponse> {
    // code
}

代码无法编译,尽管抱怨生命周期de the serde deserializer apparently creates, and that de 必须比 `r 长。这是完整的错误消息:

error: lifetime may not live long enough
  --> src/add_file.rs:18:5
   |
14 | #[derive(Deserialize)]
   |          ----------- lifetime `'de` defined here
...
17 | struct PostDocument<'r> {
   |                     -- lifetime `'r` defined here
18 |     fields: Vec<FieldValues<'r>>
   |     ^^^^^^ requires that `'de` must outlive `'r`
   |
   = help: consider adding the following bound: `'de: 'r`

A:我不确定在何处或如何指定边界:'de: 'r(我是生锈的新手,我不熟悉这种语法,而且我无法在文档中找到对它的引用)

B:我在其他文件中编写了其他端点,这些文件定义了非常相似的结构,似乎没有问题。代码本身简单地循环 Vec 并将每个添加到一个 tantivy 文档中。如果我完全注释掉使用该参数的方法主体中的所有代码,错误仍然存​​在。

C:如果我添加一个名为“de”的生命周期参数,编译器会抱怨说如果存在一个名为“de”的生命周期参数,它就无法反序列化。

【问题讨论】:

    标签: rust rust-rocket


    【解决方案1】:

    使用 String 而不是 &'r str,除非有性能限制,在这种情况下你可能应该使用 actix,最好保持简单。

    #[derive(Deserialize)]
    #[serde(crate = "rocket::serde")]
    #[derive(Debug)]
    struct FieldValues {
        name: String,
        value: String,
    }
    

    如果您坚持使用&amp;str,最好使用request.body或作为流从 Rocket 获取字节数组,然后当您拥有它时,您可以尝试从中反序列化。您仍然会遇到这样的问题,即范围一结束,主体字节就会被丢弃,如果您在其他地方使用结构,则会出现生命周期错误。 String 在这种情况下更好。

    【讨论】:

    • 谢谢!我没有意识到 String 和 str 之间的区别。 (这就是我跳过文档得到的结果)
    【解决方案2】:

    生命周期'de由宏#[derive(Deserialize)]引入。

    尝试这个:

    #[derive(Deserialize)]
    #[serde(crate = "rocket::serde")]
    #[derive(Debug)]
    struct PostDocument<'r> {
        #[serde(borrow)]
        fields: Vec<FieldValues<'r>>
    }
    

    有关更多信息,请在此处查看 serde 文档: https://serde.rs/lifetimes.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多