使用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()) }
修改说明
- 移除无关生命周期参数:删除函数签名中的
'a,因为输入buffer的生命周期和返回的T没有关联 - 使用高阶生命周期约束:
for<'a> Readable<'a, LittleEndian>表示T可以被任意生命周期的缓冲区读取,完美适配函数内部的局部decompressed_buffer,无需绑定到外部生命周期
内容的提问来源于stack exchange,提问作者Nathan Todd
相关产品推荐
相关产品推荐

