我们有一个向量
Vec<u8>
,我们想要将其反序列化为类型 T
。我们能想到的最小再现示例是
fn wrapper<'de, T>(vec: Vec<u8>) -> Result<T, serde_json::Error>
where
T: serde::Deserialize<'de>,
{
serde_json::from_slice::<'de, T>(&vec)
}
但是,编译器给出以下错误:
error[E0597]: `vec` does not live long enough
--> src/wrapper.rs:128:38
|
124 | fn wrapper<'de, T>(vec: Vec<u8>) -> Result<T, serde_json::Error>
| --- lifetime `'de` defined here
...
128 | serde_json::from_slice::<'de, T>(&vec)
| ---------------------------------^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `vec` is borrowed for `'de`
129 | }
| - `vec` dropped here while still borrowed
由于我们拥有向量的完全所有权,并且类型
T
没有对任何原始数据的引用(例如,它可能是数字或String
),所以我很困惑到底是什么导致了这个错误。
经过以下更改,我仍然遇到相同的错误:
serde::Deserialize<'static>
serde::Deserialize<'de> + 'static
serde::Deserialize<'de> + 'de
我找到了解决方案
fn wrapper<T>(vec: Vec<u8>) -> Result<T, serde_json::Error>
where
T: for<'de> serde::Deserialize<'de>,
{
serde_json::from_slice(&vec)
}
来自 Rust 的 文档
特质界限在一生中可能排名更高。这些界限指定了一个对于所有生命周期都成立的界限。
因此,这里的解决方案是让该特征绑定到所有生命周期,而不是特定的生命周期。包括函数本身的生命周期,也就是
vec
的生命周期。