2017-11-10 17 views
1

次のコードスニペットを検討してください。私はプロトコルバッファのシリアル化されたデータをメモリに保存する方法は?

DynamicMessage message2 = DynamicMessage.parsefrom(descriptor, "out.ser"); // Works 
DynamicMessage message3 = DynamicMessage.parsefrom(descriptor, "out2.ser"); // Doesn't Work 

を使用して同じファイルを解析しようとした場合

DynamicMessage message; // somehow I created the message 
// Writing directly to file 
message.writeTo(new FileOutputStream("out.ser")); 
// Wrinting through other stream 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
message.writeTo(baos); 
BufferedWriter writer = new BufferedWriter(new FileWriter("out2.ser")); 
writer.write(baos.toString()); 
writer.flush(); 
writer.close(); 

は、今私は.toString()方法で(おそらく)エンコーディングを変えたと思います。誰でもmessage.writeTo()を文字列にシリアル化する方法を提案してください(再度解析できるはずですか)。

答えて

0

baos.toString()を実行しているため、「out2.ser」への書き込みが機能していません。

protobufの内容はバイト配列として保存する必要があります。

は、私は、ファイルがほとんど、あるいは全く使用されますように書く文字列として出力したい

FileOutputStream f = new FileOutputStream("out2.ser"); 
message.writeTo(f); 
+0

ように、コードブロック

ByteArrayOutputStream baos = new ByteArrayOutputStream(); message.writeTo(baos); BufferedWriter writer = new BufferedWriter(new FileWriter("out2.ser")); writer.write(baos.toString()); 

の下に変更します。メモリ内の出力を使用する方法はありますか(おそらく文字列として、馴染みのある他のデータ型を示唆するかもしれません)。 ありがとう、 – Ran

+0

@Ranおそらく、あなたは 'DynamicMessage'を' json'文字列としてシリアル化し、その後 'DynamicMessage'を作成するようにカスタムde/serializerを作ることができます。 'toString()'で保存すると逆シリアル化できません。 –

+1

@Ran Protobufのエンコーディングはテキストではなくバイナリです。それをUTF-8テキストとしてデコードしてから再エンコードしようとすると、データが破損します。メッセージをテキストとして実際に必要とする場合は、バイナリデータを安全な(ただし読み込み不可能な)方法でテキストに変換するbase64エンコーディングを使用するか、ProtobufのTextFormatクラスを使用して人間が読めるテキストを作成することができます作成が遅く、解析が遅い)。 –

関連する問題