从字节串中提取 MsgPack - rust

Extracting MsgPack from String of bytes - rust

我正在尝试编写一个包装函数来读取包含 Vec[u8] 的字符串(实际上只是 MsgPack)并将它们转换为本机 Rust 结构,我的代码如下所示

use rmp_serde::{decode, from_slice};
use serde::Deserialize;

#[derive(Debug)]
pub enum MsgPackParseErr {
    ParseIntError,
    SerdeError,
}

impl From<std::num::ParseIntError> for MsgPackParseErr {
    fn from(_e: std::num::ParseIntError) -> Self {
        return Self::ParseIntError;
    }
}

impl From<decode::Error> for MsgPackParseErr {
    fn from(_e: decode::Error) -> Self {
        return Self::SerdeError;
    }
}

pub fn msgpack_from_byte_string<'b, T>(raw: String) -> Result<T, MsgPackParseErr>
where
    T: Deserialize<'b>,
{
    let parsing_string: Result<Vec<u8>, _> = raw.split(" ").map(|x| x.parse()).collect();
    let parsed_string = parsing_string?;
    let parsing_obj = from_slice(&parsed_string);
    Ok(parsing_obj?)
}

但我收到错误

temporary value dropped while borrowed

creates a temporary which is freed while still in use

对于第 23 到 28 行,即

let parsing_obj = from_slice(&parsed_string);
    Ok(parsing_obj?)

我不知道我做错了什么...

你的错误来自于你的代码中的 T: Deserialize<'b> 限制 T 只在生命周期 'b 内存在,这反过来意味着它不能超过 from_slice 的任何输入是(否则它会在免费错误后使用)。

pub fn msgpack_from_byte_string<'b, T>(raw: String) -> Result<T, MsgPackParseErr>
where
    T: Deserialize<'b>

那么,为什么您的序列化对象的存活时间不能长于与其关联的数据?如果可能,serde 会通过直接引用输入缓冲区来避免复制输入数据和分配额外的字段。这在 serde 手册中关于 lifetimes 的章节中也有更详细的解释。 请注意,serde 还具有其他可能更适合您的用例并且不受输入生命周期限制的特征(例如,DeserializeOwned)。