STR到对象反序列化生命周期相关的问题


struct S1<T> 
{
pub data: T
}

impl<'a, T> S1<T> where T: Deserialize<'a> {
fn update() {
let str_json = String::new(); // let's assume read from file
self.data = serve_json::from_str(&str_json).unwrap();
} 
}
由于不正确的说明符,该函数将产生与生命周期相关的问题。克服这个问题的最好方法是什么?

Deserialize不一定创建str_json数据的副本。在str_json中可能有大的文本部分在最终的T中被引用,而不是被复制到它中。这意味着,最终self.data的生命周期与str_json的生命周期相同,因为它可能会从str_json借用数据。这也是为什么必须首先指定生存期'a的原因。

现在在您的情况下,问题是self.data被存储在self中,而str_jsonupdate()的末尾被删除。但是self.data可能仍然引用str_json的数据,所以编译器有理由抱怨。

我认为你真正想要实现的是str_json的数据被复制到self.data中,而不仅仅是被引用。对于这种行为,你有错误的特征,你真正想要的是DeserializeOwned:

use serde::de::DeserializeOwned;
struct S1<T> {
pub data: T,
}
impl<T> S1<T>
where
T: DeserializeOwned,
{
fn update(&mut self) {
let str_json = String::new(); // let's assume read from file
self.data = serde_json::from_str(&str_json).unwrap();
}
}

最新更新