通用函数中 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