我有用于记录数据的协议缓冲区。
message Message {
required double val1 = 1;
optional int val2 = 2;
}
message BigObject {
repeated Message message = 1;
}
我每秒收到一条消息。它们使用我的BigObject存储在内存中,并用于执行某些任务。但与此同时,我希望将这些消息存储在文件中,以便在应用程序崩溃时进行备份。每次简单编写BigObject都会浪费时间。而且我试图找到自上次写入文件以来只写入添加的消息的方法。有办法吗?
答案 0 :(得分:3)
Protobuf是一种可附加格式,您的布局理想。只需打开位于末尾的文件 ,然后以新的(空)BigObject
开头。添加/序列化只是新的Message
实例,然后写入文件(从最后开始)。
现在,如果您从头开始解析文件 ,您将获得包含所有BigObject
个实例(旧版和新版)的单个Message
。
您实际上可以通过记录每个人Message
到达时记录,只要您每次将其包裹在BigObject
中,即以伪代码
loop {
msg = await NextMessage();
wrapper = new BigObject();
wrapper.Messages.Add(msg);
file = OpenFileAtEnd();
wrapper.WriteTo(file);
file.Close();
}