Rust 反序列化生命周期问题:'de 必须比 'a 更长寿

Seb*_*ine 7 lifetime rust serde

我有以下两个结构,我为其派生了 serde 特征。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct Item<'a> {
  pub id: &'a str,
  pub name: &'a str
}

#[derive(Serialize, Deserialize)]
struct Set<'a> {
  items: Vec<Item<'a>>
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此文件时,我收到以下错误消息,以确保生命周期参数'deDeserializeNeeds 变为 Outlife LifeLife 参数'a

15 |     #[derive(Serialize, Deserialize)]
   |                         ----------- lifetime `'de` defined here
16 |     struct Set<'a> {
   |                -- lifetime `'a` defined here
17 |         sets: Vec<Item<'a>>
   |         ^^^^ requires that `'de` must outlive `'a`
   |
   = help: consider adding the following bound: `'de: 'a`
Run Code Online (Sandbox Code Playgroud)

但是,当我按如下方式添加所需的界限时,我收到一条'de未使用的错误消息。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct Item<'a> {
  pub id: &'a str,
  pub name: &'a str
}

#[derive(Serialize, Deserialize)]
struct Set<'a, 'de: 'a> {
  items: Vec<Item<'a>>
}
Run Code Online (Sandbox Code Playgroud)
16 |     struct Set<'a, 'de: 'a> {
   |                    ^^^ unused parameter
   |
   = help: consider removing `'de`, referring to it in a field, or using a marker such as `PhantomData`
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Sve*_*ach 17

您需要添加#[serde(borrow)]到该sets字段:

#[derive(Serialize, Deserialize)]
struct Set<'a> {
    #[serde(borrow)]
    items: Vec<Item<'a>>,
}
Run Code Online (Sandbox Code Playgroud)

这将限制'de生成代码的生命周期'a&str请注意,对于或类型的字段,这种情况会隐式发生&[u8],但对于其他任何内容,您都需要显式请求特征绑定。