私のサーバーでは、自己記述メッセージ(hereと定義されています)があります.btwはこれほど簡単ではありませんでした。すでに定義されているディスクリプタから新しいprotobufを動的に構築する方法は?
この時点では、これらの自己記述型メッセージからメッセージを作成することは問題ありません。私はFileDescriptorSetを取ることができ、それぞれFileDescriptorProtoを通り、DescriptorPoolにそれぞれを追加します(BuildFileを使用して、すべての定義されたFileDescriptorを与えます)。
ここからは、DPでインスタンス化されたDynamicMessageFactoryを持つFileDescriptorSetで定義されたメッセージを作成し、GetPrototypeを呼び出すことができます(SelfDescribedMessageがメッセージfull_name()を要求し、 DPのFindMessageTypeByNameメソッド、適切にエンコードされたメッセージプロトタイプを提供します)。
質問は、既に定義されたそれぞれのDescriptorまたはmessageをどのように取ることができ、定義されたすべてのメッセージを入れ子にしたメッセージを含む 'master'メッセージを動的に構築するのですか?これは、主にメッセージの現在の状態を保存するために使用されます。現在、私たちは、サーバー内の各メッセージのタイプをインスタンス化するだけで(異なるプログラム間で中央の状態を維持するために)これを処理しています。しかし、現在の状態を「保存」したいときは、それらを定義済みのようにディスクにストリームすることが強制されますhere。それらは一度に1つのメッセージ(サイズ接頭辞付き)でストリーミングされます。私たちは、別々のメッセージの安定したストリームではなく、1つのメッセージ(すべてを統治するメッセージ)を持っていたいと思います。これは、いったん完成したら(ネットワークベースの共有状態を最適化された簡単なシリアライゼーションを使って)、他のものにも使用できます。
私たちは既にクロスリンクされた記述子を持っているので、すでに定義されているメッセージからの「新しい」メッセージこれまでのところ、このソリューションは私たちに言いました。独自のDescriptorProtoを作成し、すでに定義されているDescriptorsの型の新しいフィールドを追加しようとしましたが、紛失してしまいました。また、拡張機能として追加することも考えられています(現時点では知られていません)。 DescriptorDatabaseを作成する必要がありますか(現時点ではその方法はわかりません)
洞察?
BitBucketのリンクexample source。
この説明が役立ちますように。
すでに定義された一連のメッセージからメッセージを動的に作成しようとしています。すでに定義されているメッセージのセットは、公式のC++ protobufチュートリアル(コンパイルされた形式では利用できないこれらのメッセージ)で説明されている「自己記述」メソッドを使って作成されます。この新しく定義されたメッセージは、実行時に作成する必要があります。
各メッセージに対してストレートディスクリプタを使用しようとしましたが、FileDescriptorProtoを構築しようとしました。 DatabaseDescriptorメソッドを見てみました。どちらも運がありません。現在、これらの定義されたメッセージを別のメッセージの拡張機能として追加しようとしています(たとえコンパイル時に定義されたメッセージであっても、それらの記述子セットは拡張されていません)。
すごい...いなくてもコメントが...ここです: – g19fanatic
私が現時点で持っている問題は、拡張識別子の初期化です。 MessageTypeTraitsをメッセージタイプを記述するクラス(私自身のテンプレートマジックを行う必要があるかもしれません)に向けるクラスが必要ですが、まだ成功していません... – g19fanatic
正直なところ、私はあなたの質問を3回読みました。まだ何を記述しているのか理解していません。私はこれがほとんどの読者に起こると思うので、返事を得られなかったのです。あなたはものを簡素化する必要があります。また、はるかに簡単な解決策が可能な、複雑すぎるものを構築しているような気がします。 – Codeguard