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

4

我有以下两个结构体,需要派生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>>
}

当我尝试编译这个时,我得到了以下错误信息,以确保来自Deserialize的生命周期参数'de需要超过生命周期参数'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`

但是当我按照以下所需的绑定添加时,我收到了一个错误消息,'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>>
}

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`

我该如何解决这个问题?
1个回答

13

您需要在sets字段中添加#[serde(borrow)]

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

这将在生成的代码中将'de的生命周期绑定到'a上。需要注意的是,对于&str&[u8]类型的字段,这是隐式发生的,但对于其他任何类型,您需要显式地请求trait bound。


1
金克丝,你说得对,你的答案更好。 - cafce25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接