如何使用要求实现者实现serde :: Deserialize

时间:2019-03-03 13:40:55

标签: serialization rust lifetime serde

Playground link

我有一些使用from_path()方法从TOML文件中反序列化的结构。为了防止复制代码,我尝试使用通用方法创建一个特征来做到这一点,我可以像这样实现

impl FromTomlFile for MyStruct {}

不幸的是,由于serde::Deserialize上的有效期参数,这并不像我想象的那么简单。

use serde;
use serde_derive::Deserialize; // 1.0.88
use std::fs;
use std::path::Path;
use toml; // 0.4.10

#[derive(Deserialize)]
struct A {}

trait FromTomlFile<'de>
where
    Self: Sized + serde::Deserialize<'de>,
{
    fn from_path<P: AsRef<Path>>(path: P) -> Result<Self, toml::de::Error> {
        toml::from_str(&String::from_utf8_lossy(&fs::read(&path).unwrap()))
    }
}

impl FromTomlFile for A {} // <-- doesn't work

如何使它正常工作?

1 个答案:

答案 0 :(得分:2)

Deserialize替换为DeserializeOwned-这使您摆脱了明确的生存期'de

trait FromTomlFile
where
    Self: Sized + serde::de::DeserializeOwned,
// etc