2016-03-14 17 views
5

私はバイト配列-バイト[]を持っていると考えています。これは何らかのシリアル化されたprotobufオブジェクトを表しています。 1がintフィールドであり、2と3は、文字列と4ですJava print protobufオブジェクトが不明なタイプ

1: 123 
2: Jhon 
3: Doe 
4: 0 

のようなものがboolenされる出力にそれを印刷する方法がある

TextFormat.printコンクリートBuilderを提供するために、私を必要とし私が知らないprotobufオブジェクトの。私たちはフィールドがすべてのプリミティブ型(すなわちないサブメッセージ)であるという仮定を作ることができれば

答えて

1

その後、あなたは非常に単純にすべてのフィールドをループにできるはずです - しかし

for(Entry<FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) 
{ 
    if(entry.getValue() != null) 
     System.out.println(entry.getKey().getName() + ": " + entry.getValue().toString()); 
    else 
    System.out.println(entry.getKey().toString() + ": null"); 
} 

、私はかなりしていますいるProtobufオブジェクトが正しく、toString()メソッドを実装するので、私はあなたが単にいるProtobufオブジェクトの文字列表現を取得するために

protoObj.toString() 

を呼び出すことができるはずだと思うことを確認してください。それにtoString()を呼んで、今EmptyMessageとして、あなたのメッセージを解析

message EmptyMessage { 
    // nothing 
} 

:のようなタイプEmptyMessageを定義 https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/GeneratedMessage.ExtendableMessage#getAllFields%28%29

+0

私は上記のようにメッセージオブジェクトを持っていません。私はバイト配列 – user12384512

+0

Googleのprotobufライブラリを使用して、あなたはバイト配列だけでオブジェクトを構築することができるはずです。なぜそれを行うための図書館があるときにそれを自分で解析するのですか? –

+0

このオリジナルの質問は、protobufライブラリの使用法ではなく、未知のタイプのメッセージをどのように印刷するかということでした。 – user12384512

4

: は、詳細情報については、を見てみましょう。

これはなぜ機能しますか?メッセージタイプにフィールドを追加することは後方互換性があると考えてください。フィールドを追加すると、そのフィールドを使用してビルドされていない古いプログラムにそのフィールドを使用してメッセージを送信すると、フィールドは「未知のフィールド」として扱われます。未知のフィールドは、数値と値のペアとして出力されます。ここでEmptyMessageで始まりフィールドを追加すると、他のメッセージは明らかにになります。したがって、すべてのメッセージタイプはEmptyMessageで "下位互換"です。したがって、すべてのフィールドを未知のフィールドとして扱うには、すべてのメッセージをEmptyMessageとして解析することができます。

+0

protoで空のmsgを宣言することなく、どのようにしたらよいでしょうか?ランタイムで動的に意味するのですか? – user12384512

+0

@ user12384512申し訳ありませんが、わかりません。同じ 'EmptyMessage'がすべての型で動作するので、なぜそれを"実行時に動的に "定義する必要がありますか?なぜこの機能のために他のコードを書くのと同時にEmptyMessageを定義できないのですか?つまり、「実行時に動的に」することを本当に主張しているのであれば、「DynamicMessage」を使うことができますが、これはもっとうまくいくことになり、利点はありません。 –

+0

注意:protobufがサブメッセージを含むメッセージを表す場合、サブメッセージはバイト配列として文字列化されます。つまり、サブメッセージはシリアル化されません。 – user100464

関連する問題