以谷歌的教程为例:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
它使用一个AddressBook包装消息来存储多个Person消息。如果我对其进行序列化或反序列化,则使用
AddressBook.mergeFrom(FileInputStream)
addressBook.build.().writeTo()
之类的方法但是如果我有2000万个人记录,则显然会溢出。谷歌还说,如果我想在一个文件中存储多个消息而不使用包装消息,我需要记录每个消息的长度,这对于字符串类型是不可能的。
是否有一种在一个文件中序列化大量消息的好方法?
而且我正在使用Java。
最佳答案
我没有尝试过,但是我希望它能起作用:
写作:
CodedOutputStream output = CodedOutputStream.newInstance(...);
while (...) {
Person person = ...;
output.writeMessageNoTag(person);
}
阅读:
CodedInputStream input = CodedInputStream.newInstance(...);
while (!input.isAtEnd()) {
Person.Builder builder = Person.newBuilder();
input.readMessage(builder, null); // Or specify extension registry
Person person = builder.build();
// Use person
}