使用serde_json从Vec反序列化<u8>

问题描述 投票:0回答:1

我们有一个向量

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
rust lifetime serde
1个回答
0
投票

我找到了解决方案

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

© www.soinside.com 2019 - 2024. All rights reserved.