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()
を文字列にシリアル化する方法を提案してください(再度解析できるはずですか)。
ように、コードブロック
の下に変更します。メモリ内の出力を使用する方法はありますか(おそらく文字列として、馴染みのある他のデータ型を示唆するかもしれません)。 ありがとう、 – Ran
@Ranおそらく、あなたは 'DynamicMessage'を' json'文字列としてシリアル化し、その後 'DynamicMessage'を作成するようにカスタムde/serializerを作ることができます。 'toString()'で保存すると逆シリアル化できません。 –
@Ran Protobufのエンコーディングはテキストではなくバイナリです。それをUTF-8テキストとしてデコードしてから再エンコードしようとすると、データが破損します。メッセージをテキストとして実際に必要とする場合は、バイナリデータを安全な(ただし読み込み不可能な)方法でテキストに変換するbase64エンコーディングを使用するか、ProtobufのTextFormatクラスを使用して人間が読めるテキストを作成することができます作成が遅く、解析が遅い)。 –