Как я могу десериализовать поле bincode без заданной длины - PullRequest
2 голосов
/ 17 мая 2019

Итак, я пытаюсь десериализовать сообщение, состоящее из двоичных данных (bincode), этот двоичный файл не сериализуется serde, но я пытаюсь использовать serde для его десериализации.Однако отправка данных может иметь раздел необработанных данных, в конце которого длина не имеет префикса, но гарантированно будет остальной частью сообщения.Серде всегда ожидает длины.Я не могу добавить длину из-за проблем обратной совместимости с системой, не созданной / спроектированной мной, это сравнение важно.Можно ли этого достичь с помощью Serde и как мне поступить?

Я уже посмотрел документы для serde и bincode и не смог найти там ничего, что могло бы мне помочь.

1 Ответ

3 голосов
/ 17 мая 2019

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(())
}
...