Как я могу добавить разделители между различными записями в файле в двоичном коде? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующие struct

struct Employee {
    id: u64,
    name: String,
}

Я сериализую его с помощью следующего кода, а затем записываю сериализованный байтовый массив в файл:

let emp = Employee {
    id: 1546,
    name: "abcd".to_string(),
};

let mut file = OpenOptions::new()
    .read(true)
    .write(true)
    .create(true)
    .open("hello.txt")
    .unwrap();

let initial_buf = &bincode::serialize(&emp).unwrap();

println!("Initial Buf: {:?}", initial_buf);

file.write(&initial_buf);
file.write(&[b'\n']);
file.flush();

file.seek(SeekFrom::Start(0)).unwrap();

let mut final_buf: Vec<u8> = Vec::new();

let mut reader = BufReader::new(file);

reader.read_until(b'\n', &mut final_buf).unwrap();

println!("Final Buf: {:?}", final_buf);

Я получаю следующий вывод:

Initial Buf: [10, 6, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100]
Final Buf: [10]

1 Ответ

0 голосов
/ 07 мая 2018

Контракт Bincode заключается в том, что вы даете ему значение для сериализации, и оно возвращает вам байты. Контракт не гарантирует, что возвращаемые вами байты не могут содержать символ новой строки.

В ваших данных целое число 1546 равно 0x60A, которое представлено в байтах [10, 6, 0, 0].

Вы должны иметь возможность работать с данными Bincode без каких-либо разделителей. Функция bincode::deserialize_from будет знать, где остановить чтение.

...