gpt4 book ai didi

rust - serde_json 具有通用函数的反序列化和生命周期

转载 作者:行者123 更新时间:2023-12-05 01:57:54 27 4
gpt4 key购买 nike

存在生命周期和 serde::deserialize 问题。尝试阅读错误消息并尝试实现反序列化,但随后出现错误,我需要实现反序列化。
没有生命周期,它可以工作

use serde::{ Deserialize, Serialize, de::DeserializeOwned};
use std::error::Error;
use std::io::{BufReader};
use std::{ fmt::Debug};
use std::{fs::File};

#[derive(Clone, Debug, Serialize, Deserialize)]
struct User<'a> {
name: &'a str,
}

fn main(){
let b: User = read_object("user_1.json").unwrap();
}


fn read_object<T>(path: &str) -> Result<T, Box<dyn Error>>
where
T: DeserializeOwned + Debug,
{
let f = File::open(&path)?;
let reader = BufReader::new(f);

let t: T = serde_json::from_reader(reader)?;

Ok(t)
}

错误:

   error: implementation of `Deserialize` is not general enough
--> src/main.rs:13:19
|
13 | let b: User = read_object("user_1.json").unwrap();
| ^^^^^^^^^^^ implementation of `Deserialize` is not general enough
|
= note: `User<'_>` must implement `Deserialize<'0>`, for any lifetime `'0`...
= note: ...but `User<'_>` actually implements `Deserialize<'1>`, for some specific lifetime `'1`

最佳答案

此代码无法运行。

Deserialize<'de> trait 有一个与之关联的生命周期以支持零拷贝反序列化。本质上允许反序列化类型直接从源引用数据。参见 Understanding deserializer lifetimes .

当你有

#[derive(Deserialize)]
struct User<'a> {
name: &'a str,
}

User将有一生 'a链接到反序列化源。和 name将是对该源中字符串值的引用。

另一方面, DeserializeOwned trait 不支持零拷贝反序列化。反序列化类型不得具有与 Deserializer 关联的生命周期. “拥有”意味着它不借用任何东西。你得到的神秘错误是由于方式 DeserializeOwned被定义,它将为任何实现 Deserialize 的类型实现对于 any 生命周期,这将排除期望特定生命周期的类型。当不需要或无法保证生命周期时使用此界限。

serde_json::from_reader就是其中一种情况。它仅反序列化来自基于 Read 的来源的 JSON特征。然而,Read trait 不保证任何读取的数据在事后都是可引用的。因此 from_reader指示 T: DeserializeOwned来避免这个问题。

要利用零拷贝反序列化,您需要使用 from_slice from_str :

let data = std::fs::read_to_string(path)?;
let user: User = serde_json::from_str(&data)?;

但是,即使您这样做了,被引用的数据也只是read_object 的本地数据。功能。从文件中检索到的所有数据都在函数结束时被销毁,并留下 user.name。退回无效。编译器会拒绝它 ( playground )。

Without lifetimes, it works

这就是我建议你做的;只需使用 struct User { name: String } .由于 escape sequences,我建议不要尝试使用 JSON 字符串的零成本反序列化。 .

关于rust - serde_json 具有通用函数的反序列化和生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68795063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com