通用函数中 Serde 的生命周期错误
Lifetime error with Serde in a Generic Function
我正在尝试编写一个生成线程来处理与服务器交互的通用函数。不幸的是,我遇到了一个我不明白的借用错误。
这是我的函数代码:
fn spawn_response_thread<
'a,
MessageT:serde::Serialize + Send + 'static,
ResponseT: serde::Deserialize<'a> + 'static,
ResponseHandlingT: Fn(Result<ResponseT, String>) + Send + 'static
>
(
message : MessageT,
server_address : Option<(String,u16)>,
response_handler: ResponseHandlingT,
max_wait_time : Option<u64>
)
{
thread::spawn(
move ||
{
// First connect to a specific or random server
/**/
// Then send the desired request
/**/
// Loop to try receiving the message for a given time
let mut nb_wait = 0;
let mut buf;
let mut received = false;
/**/
// Send a response if there is one
if !received
{
response_handler(Err(format!("No response from server")));
}
else
{
let response : bincode::Result<ResponseT> = deserialize(&buf[..]);
match response
{
Ok(rcv) =>
{
response_handler(Ok(rcv));
}
Err(_) =>
{
response_handler(Err(format!("Error when trying to read response from server")));
}
}
}
} // <- line 353
);
}
(我删掉了部分代码,因为我觉得有些不相关)
使用此代码,出现以下编译错误:
error[E0597]: `buf` does not live long enough
--> src/network.rs:340:81
|
230 | 'a,
| -- lifetime `'a` defined here
...
340 | let response : bincode::Result<ResponseType> = deserialize(&buf[..]);
| -------------^^^-----
| | |
| | borrowed value does not live long enough
| argument requires that `buf` is borrowed for `'a`
...
353 | }
| - `buf` dropped here while still borrowed
不明白为什么反序列化后buf
还会被借用。
我做错了什么?
serde 的 Deserialize
特征具有生命周期 'de
。此生命周期用于实现 zero-copy 反序列化 :避免复制,例如字符串,而不是使用我们反序列化的 already-exisiting 缓冲区。
但是如果你的对象比缓冲区长,它就不能依赖它!在这种情况下,您需要一个永远存在的反序列化,或者 for<'de> Deserialize<'de>
。 Serde 有一个特点,DeserializeOwned
,本质上是这样的:for<'de> Deserialize<'de>
的快捷方式。那么如果使用 DeserializeOwned
而不是 Deserialize
:
fn spawn_response_thread<
MessageT: serde::Serialize + Send + 'static,
ResponseT: serde::de::DeserializeOwned + 'static,
ResponseHandlingT: Fn(Result<ResponseT, String>) + Send + 'static,
>(
message: MessageT,
server_address: Option<(String, u16)>,
response_handler: ResponseHandlingT,
max_wait_time: Option<u64>,
) {
// ...
}
有关更多信息,请查看 Understanding deserializer lifetimes - serde.rs。
我正在尝试编写一个生成线程来处理与服务器交互的通用函数。不幸的是,我遇到了一个我不明白的借用错误。 这是我的函数代码:
fn spawn_response_thread<
'a,
MessageT:serde::Serialize + Send + 'static,
ResponseT: serde::Deserialize<'a> + 'static,
ResponseHandlingT: Fn(Result<ResponseT, String>) + Send + 'static
>
(
message : MessageT,
server_address : Option<(String,u16)>,
response_handler: ResponseHandlingT,
max_wait_time : Option<u64>
)
{
thread::spawn(
move ||
{
// First connect to a specific or random server
/**/
// Then send the desired request
/**/
// Loop to try receiving the message for a given time
let mut nb_wait = 0;
let mut buf;
let mut received = false;
/**/
// Send a response if there is one
if !received
{
response_handler(Err(format!("No response from server")));
}
else
{
let response : bincode::Result<ResponseT> = deserialize(&buf[..]);
match response
{
Ok(rcv) =>
{
response_handler(Ok(rcv));
}
Err(_) =>
{
response_handler(Err(format!("Error when trying to read response from server")));
}
}
}
} // <- line 353
);
}
(我删掉了部分代码,因为我觉得有些不相关)
使用此代码,出现以下编译错误:
error[E0597]: `buf` does not live long enough
--> src/network.rs:340:81
|
230 | 'a,
| -- lifetime `'a` defined here
...
340 | let response : bincode::Result<ResponseType> = deserialize(&buf[..]);
| -------------^^^-----
| | |
| | borrowed value does not live long enough
| argument requires that `buf` is borrowed for `'a`
...
353 | }
| - `buf` dropped here while still borrowed
不明白为什么反序列化后buf
还会被借用。
我做错了什么?
serde 的 Deserialize
特征具有生命周期 'de
。此生命周期用于实现 zero-copy 反序列化 :避免复制,例如字符串,而不是使用我们反序列化的 already-exisiting 缓冲区。
但是如果你的对象比缓冲区长,它就不能依赖它!在这种情况下,您需要一个永远存在的反序列化,或者 for<'de> Deserialize<'de>
。 Serde 有一个特点,DeserializeOwned
,本质上是这样的:for<'de> Deserialize<'de>
的快捷方式。那么如果使用 DeserializeOwned
而不是 Deserialize
:
fn spawn_response_thread<
MessageT: serde::Serialize + Send + 'static,
ResponseT: serde::de::DeserializeOwned + 'static,
ResponseHandlingT: Fn(Result<ResponseT, String>) + Send + 'static,
>(
message: MessageT,
server_address: Option<(String, u16)>,
response_handler: ResponseHandlingT,
max_wait_time: Option<u64>,
) {
// ...
}
有关更多信息,请查看 Understanding deserializer lifetimes - serde.rs。