要求 `'de` 必须比 `'a` 存在得更久

Tea*_*mer 2 rust serde

我一直在尝试实现结构的反序列化和序列化特征。我只是沿着编译器告诉我的路线走下去,然后就陷入了困境。

我从这个结构开始:

#[derive(Serialize, Deserialize)]
struct FileMetadata {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType,
}
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:expected named lifetime parameter, help: consider introducing a named lifetime parameter.

所以我这样做:

#[derive(Serialize, Deserialize)]
struct FileMetadata<'a> {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType<'a>,
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:requires that 'de must outlive'a , help: consider adding the following bound: 'de: 'a

所以我就按照它说的去做:

#[derive(Serialize, Deserialize)]
struct FileMetadata<'a, 'de>
where
'de: 'a {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType<'a>,
}
Run Code Online (Sandbox Code Playgroud)

现在我收到两个错误:

  1. cannot deserialize when there is a lifetime parameter called 'de
  2. unused parameter, help: consider removing , referring to it in a field, or using a marker such as PhantomData.

我也尝试遵循这篇文章的建议,但这会导致同样的结果。

我可以解决第二个错误,但不能解决第一个错误。我发现这个错误非常令人沮丧,因为编译器向我发送了一条路径,最后给了我相当于“计算机说不”的错误。我在这里错过了什么,有人可以解释我哪里出了问题,以及我将来如何避免此类问题。

dto*_*nay 6

这是 crate 0.19.15 版本中的一个错误mediatype。请参阅https://github.com/picoHz/mediatype/pull/15

您可以像这样解决它:

// [dependencies]
// mediatype = "0.19"
// serde = "1"
// serde_derive = "1"

use mediatype::MediaType;
use serde::de::{Deserialize, Deserializer};
use serde_derive::Deserialize;
use std::path::PathBuf;
use std::time::SystemTime;

#[derive(Deserialize)]
pub struct FileMetadata<'a> {
    pub file_path: PathBuf,
    pub last_updated: SystemTime,
    #[serde(borrow, deserialize_with = "mediatype_workaround")]
    pub mediatype: MediaType<'a>,
}

fn mediatype_workaround<'de: 'a, 'a, D>(deserializer: D) -> Result<MediaType<'a>, D::Error>
where
    D: Deserializer<'de>,
{
    let s: &str = Deserialize::deserialize(deserializer)?;
    MediaType::parse(s).map_err(serde::de::Error::custom)
}
Run Code Online (Sandbox Code Playgroud)