rust 使用serde_json从Vec反序列化< u8>[重复]

eanckbw9  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(111)

此问题在此处已有答案

Rust and serde deserializing using generics(2个答案)
6天前关门了。
我们有一个向量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
jdgnovmf

jdgnovmf1#

我找到了解决办法

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的生存期。

相关问题