以谷歌的教程为例:

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
}

08-18 10:59
查看更多