You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Speedy trait时遭遇Rust生命周期错误的技术求助

问题:使用Speedy库解码时的生命周期错误

我正在开发一款消息加解密器,使用Speedy库解码对象时遇到了生命周期问题。尝试了多种生命周期配置都无效,始终无法完成缓冲区解码,以下是代码和cargo check的错误输出。

代码

use flate2::read::ZlibDecoder;
use flate2::write::ZlibEncoder;
use flate2::Compression;
use rsa::{pkcs1::DecodeRsaPublicKey, pkcs8::DecodePrivateKey, Pkcs1v15Encrypt};
use speedy::{LittleEndian, Readable, Writable};
use std::io::Read;

pub struct Communication {
    client_priv_key: rsa::RsaPrivateKey,
    server_pub_key: rsa::RsaPublicKey,
    rng: rand::rngs::ThreadRng,
}

impl Communication {
    pub fn new(priv_key: &str, pub_key: &str) -> Self {
        let client_priv_key = rsa::RsaPrivateKey::from_pkcs8_pem(priv_key).unwrap();
        let server_pub_key = rsa::RsaPublicKey::from_pkcs1_pem(pub_key).unwrap();
        let rng = rand::thread_rng();
        Self {
            client_priv_key,
            server_pub_key,
            rng,
        }
    }

    pub fn encrypt_object<T>(&mut self, obj: &T) -> Vec<u8>
    where
        T: Writable<LittleEndian>,
    {
        let mut buffer = Vec::new();
        obj.write_to_stream(&mut buffer).unwrap();
        let encoder = ZlibEncoder::new(buffer, Compression::default());
        let buffer = encoder.finish().unwrap();
        self.server_pub_key
            .encrypt(&mut self.rng, Pkcs1v15Encrypt, &buffer)
            .unwrap()
    }

    pub fn decrypt_object<'a, T>(&self, buffer: &'a [u8]) -> Result<T, speedy::Error>
    where
        T: Readable<'a, LittleEndian>,
    {
        let decrypted_buffer = self
            .client_priv_key
            .decrypt(Pkcs1v15Encrypt, buffer)
            .map_err(|_| speedy::Error::custom("Decryption failed"))?;

        let mut decoder = ZlibDecoder::new(decrypted_buffer.as_slice());
        let mut decompressed_buffer: Vec<u8> = Vec::new();
        decoder
            .read_to_end(&mut decompressed_buffer)
            .map_err(|_| speedy::Error::custom("Decompression failed"))?;

        T::read_from_buffer(decompressed_buffer.as_slice())
    }
}

错误输出

Checking client v0.1.0 (/workspaces/codespaces-blank)
error[E0597]: `decompressed_buffer` does not live long enough
  --> src/lib.rs:54:29
   |
39 |     pub fn decrypt_object<'a, T>(&self, buffer: &'a [u8]) -> Result<T, speedy::Er...
   |                           -- lifetime `'a` defined here
...
49 |         let mut decompressed_buffer: Vec<u8> = Vec::new();
   |             ----------------------- binding `decompressed_buffer` declared here
...
54 |         T::read_from_buffer(decompressed_buffer.as_slice())
   |         --------------------^^^^^^^^^^^^^^^^^^^------------
   |         |                   |
   |         |                   borrowed value does not live long enough
   |         argument requires that `decompressed_buffer` is borrowed for `'a`
55 |     }
   |     - `decompressed_buffer` dropped here while still borrowed

For more information about this error, try `rustc --explain E0597`.
error: could not compile `client` (lib) due to 1 previous error

解决方案

问题根源

你错误地将输入参数buffer的生命周期'a与解码目标T的生命周期绑定,但decompressed_buffer是函数内部创建的局部变量,它的生命周期远短于'a。Readable<'a>要求T的生命周期依赖于'a,但实际解码数据来自局部缓冲区,和输入buffer的生命周期完全无关。

修改后的代码

pub fn decrypt_object<T>(&self, buffer: &[u8]) -> Result<T, speedy::Error>
where
    T: for<'a> Readable<'a, LittleEndian>,
{
    let decrypted_buffer = self
        .client_priv_key
        .decrypt(Pkcs1v15Encrypt, buffer)
        .map_err(|_| speedy::Error::custom("解密失败"))?;

    let mut decoder = ZlibDecoder::new(decrypted_buffer.as_slice());
    let mut decompressed_buffer: Vec<u8> = Vec::new();
    decoder
        .read_to_end(&mut decompressed_buffer)
        .map_err(|_| speedy::Error::custom("解压缩失败"))?;

    T::read_from_buffer(decompressed_buffer.as_slice())
}

修改说明

  1. 移除无关生命周期参数:删除函数签名中的'a,因为输入buffer的生命周期和返回的T没有关联
  2. 使用高阶生命周期约束:for<'a> Readable<'a, LittleEndian>表示T可以被任意生命周期的缓冲区读取,完美适配函数内部的局部decompressed_buffer,无需绑定到外部生命周期

内容的提问来源于stack exchange,提问作者Nathan Todd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:47:04