rust - 如何反序列化没有给定长度的 bincode 字段

标签 rust deserialization serde

所以我正在尝试反序列化由二进制数据 (bincode) 组成的消息,这个二进制文件不是由 serde 序列化的,但我正在尝试使用 serde 来反序列化它。但是,发送的数据可选地有一个原始数据部分,其末尾的长度没有前缀,但保证是消息的其余部分。 Serde 总是期望一个长度。由于与不是我制造/设计的系统的向后兼容性问题,我无法添加长度,这种兼容性很重要。这有可能通过 Serde 实现吗?我将如何去做?

我已经查看了 serde 和 bincode 的文档,但在其中找不到任何可以帮助我的东西。

最佳答案

bincode::deserialize_from让您保留输入流中的任何尾随数据。


use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Data {
    q: String,
    r: i32,

    #[serde(skip)]
    trailing: Vec<u8>,
}

fn main() -> bincode::Result<()> {
    let bytes = [7, 0, 0, 0, 0, 0, 0, 0, 115, 117, 99, 99, 101, 115, 115, 227, 7, 0, 0, 3, 2, 1];

    let mut cursor = &bytes[..];
    let mut data: Data = bincode::deserialize_from(&mut cursor)?;
    data.trailing = cursor.to_owned();

    println!("{:#?}", data);
    Ok(())
}

关于rust - 如何反序列化没有给定长度的 bincode 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188291/

相关文章:

json - Serde反序列化为多个结构之一?

rust - 使用Rust中的Serde从json提升嵌套值可能是可选的

rust - 为什么这个值活得不够长?

rust - 返回对内部集合的引用时的迭代器生命周期问题

java - Jackson Deserializer 没有默认(无参数)构造函数

java - Moshi 有像 Gson 这样的运行时类型适配器工厂吗?

rust - 如何使用serde-json库为包含原始值的结构计算哈希

rust - 是否有可能等待一个 &dyn future ?

rust - 我如何借用 RefCell<HashMap>、找到一个键并返回对结果的引用?

java - 使用 setAccessible(true) 的最终字段语义和反序列化