2016-08-31 12 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))を使用します。

関連する問題