从字节串中提取 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)。
我正在尝试编写一个包装函数来读取包含 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)。