Как заставить структуру Serde работать как с заимствованными, так и с собственными данными? - PullRequest
2 голосов
/ 01 августа 2020

Я хочу создать структуру Serde, которая может десериализоваться либо из заимствованных данных (serde_json::from_str), либо из собственных данных (serde_json::from_reader). Я прочитал Общие сведения о времени жизни десериализатора и понимаю разницу между двумя границами характеристик (<'de, T> where T: Deserialize<'de> и <T> where T: DeserializeOwned); мне нужна структура, реализующая обе границы признаков, так что ее можно использовать из любой функции десериализации.

Следующий код ( игровая площадка ) отказывается компилироваться:

use serde_json; // 1.0.56
use serde; // 1.0.114
use std::fs;
use std::io;
use std::borrow::Cow;

#[derive(serde::Deserialize)]
struct Resource<'s> {
    // The Cow should allow for either borrowed or owned data
    #[serde(borrow)]
    pub foo: Cow<'s, str>,
}

fn main() {
    {
        // Works as expected when referencing a string...
        let s = "{\"foo\":\"bar\"}";
        let resource: Resource = serde_json::from_str(s).unwrap();
    }
    {
        // ...but refuses to compile when reading from a file
        let file = fs::File::open("dummy.json").unwrap();
        let reader = io::BufReader::new(file);
        let resource: Resource = serde_json::from_reader(reader).unwrap();
    }
}

Как заставить эту структуру работать как с собственными, так и с заимствованными данными? Есть ли способ сделать что-то вроде #[serde(borrow_optional)]?

...