如何使Serde结构同时支持借用和拥有的数据?

9
我想创建一个Serde结构体,它可以从借用数据(`serde_json::from_str`)或拥有的数据(`serde_json::from_reader`)反序列化。我已经阅读了Understanding deserializer lifetimes,并且理解了两个trait约束之间的区别( `< ' de,T > where T: Deserialize <' de >` 和 ` where T: DeserializeOwned`)。我的目标是实现同时满足这两个trait约束的结构体,以便从任意一个反序列化函数中使用。
以下代码(playground)无法编译:
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)]的方法?

1个回答

1

(示例链接)

根据 serde_json::from_reader 的限制,这是不可能的。但是,如果你自己构造 Deserializer,那么就可以实现:

        // ...but refuses to compile when reading from a file
        let file = fs::File::open("dummy.json").unwrap();
        let reader = io::BufReader::new(file);
        let mut deser = serde_json::Deserializer::from_reader(reader);
        let resource = Resource::deserialize(&mut deser).unwrap();

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