如何在二进制文件中的不同记录之间添加分隔符?

时间:2018-05-07 14:25:59

标签: serialization rust deserialization serde

我关注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 :(得分:2)

Bincode的合同是你给它一个序列化的值,它给你回字节。合同不保证您获得的字节不能包含换行符。

在您的数据中,整数1546是0x60A,表示为字节[10, 6, 0, 0]

您应该能够使用Bincode数据而不需要任何分隔符。 bincode::deserialize_from函数将知道在哪里停止阅读。