2016-08-31 4 views
1

Я пытаюсь сериализовать и десериализовать сообщения protobuf. Следуя примеру из documentation, я пишу:Буферы протоколов: чтение всех сериализованных сообщений из файла

ByteArrayOutputStream out = new ByteArrayOutputStream(...); 
ArrayList<AddressBookProtos.Person> messages = ...; 
for (int i = 0; i < messages.size; i++){ 
    messages.writeTo(out); 
    out.flush(); 
} 
out.close(); 

При чтении сообщения обратно, я бы ожидать, чтобы написать:.

ByteArrayInputStream in = new ByteArrayInputStream(...); 
ArrayList<AddressBookProtos.Person> messages = new ArrayList<...>(); 
while (in.available() > 0) { 
    messages.add(AddressBookProtos.Person.parseFrom(in)); 
} 

Однако, я всегда получаю только один результат обратно в Где другие результаты исчезли?

ответ

3

Вы должны использовать writeDelimitedTo/parseDelimitedFrom или реализовать свое собственное решение на основе разделителей.

По Javadoc:

... пишет размер сообщения как varint перед записью данных. Это позволяет записывать больше данных в поток после сообщения без необходимости разграничивать данные сообщений самостоятельно. Используйте MessageLite.Builder.mergeDelimitedFrom(InputStream) (или статический метод YourMessageType.parseDelimitedFrom(InputStream)) для анализа сообщений, написанных этим методом.

Смежные вопросы