我一直在尝试实现结构的反序列化和序列化特征。我只是沿着编译器告诉我的路线走下去,然后就陷入了困境。
我从这个结构开始:
#[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)
现在我收到两个错误:
cannot deserialize when there is a lifetime parameter called 'de
unused parameter, help: consider removing
德, referring to it in a field, or using a marker such as PhantomData.
我也尝试遵循这篇文章的建议,但这会导致同样的结果。
我可以解决第二个错误,但不能解决第一个错误。我发现这个错误非常令人沮丧,因为编译器向我发送了一条路径,最后给了我相当于“计算机说不”的错误。我在这里错过了什么,有人可以解释我哪里出了问题,以及我将来如何避免此类问题。
这是 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)
归档时间: |
|
查看次数: |
104 次 |
最近记录: |