在我的服務器上,我們收到自描述消息(如定義here ......這不是那麼容易,因爲在C++中沒有任何'好'的例子)。如何從一組已定義的描述符動態構建新的protobuf?
在這一點上,我沒有從這些自我描述的創建消息的問題。我可以使用FileDescriptorSet,通過每個FileDescriptorProto,將每個添加到DescriptorPool(使用BuildFile,這也給我每個定義的FileDescriptor)。
從這裏我可以創建任何在FileDescriptorSet中定義的消息,並使用DynamicMessageFactory實例化DP並調用GetPrototype(這很容易實現,因爲我們的SelfDescribedMessage需要消息full_name(),因此我們可以調用DP的FindMessageTypeByName方法,給我們正確編碼的消息原型)。
問題是,我如何獲取每個已定義的描述符或消息並動態地生成一個包含所有已定義消息的「主」消息作爲嵌套消息。這主要用於保存消息的當前狀態。目前我們只是通過實例化服務器中每種消息的類型來處理這個問題(以保持跨不同程序的中心狀態)。但是,當我們想要「保存」當前狀態時,我們不得不按照定義的here將它們流式傳輸到磁盤。它們每次只能傳輸一條消息(大小前綴)。我們希望有一條消息(一條來統治它們),而不是穩定的單獨消息流。這可以用於其他事情一旦制定出來(基於網絡的優化和簡單的序列化共享狀態)
由於我們已經有了交叉鏈接和定義的描述符,人們會認爲會有一種簡單的方法來構建來自那些已經定義的消息的'新'消息。到目前爲止,解決方案已經提到了我們。我們嘗試創建自己的DescriptorProto,並從已定義的描述符中添加新類型的字段,但卻迷失了方向(尚未深入探討)。我們也研究過可能將它們添加爲擴展名(目前未知如何實現)。我們是否需要創建我們自己的DescriptorDatabase(此時還不知道該怎麼做)?
任何見解?
鏈接example source在BitBucket上。
希望這個解釋會有所幫助。
我試圖從一組已定義的消息中動態構建消息。這組已經定義的消息是通過使用官方C++ protobuf教程中(簡要地)解釋的「自描述」方法創建的(即,這些消息在編譯後不可用)。這個新定義的消息將需要在運行時創建。
已嘗試使用每個消息的直接描述符並嘗試構建FileDescriptorProto。曾嘗試查看DatabaseDescriptor方法。兩者都沒有運氣。目前試圖將這些定義的消息添加爲另一個消息的擴展(甚至在編譯時,這些定義的消息及其'描述符集'未被分類爲擴展任何東西),這是示例代碼開始的地方。
哇......甚至沒有評論...以下是我在哪裏爲止。這是我唯一擁有公共資源的人......它現在顯然不能編譯(直到最初創建ExtensionSet的那一端)......現在嘗試將擴展路由作爲另一個路由到目前爲止,還有兩個失敗了。 http://goo.gl/VJhnk – g19fanatic 2012-08-22 03:26:26
我現在遇到的問題是擴展標識符的初始化。我需要一個類來指定MessageTypeTraits到一個描述消息類型的類(可能要做我自己的模板魔法?),但到目前爲止還沒有成功...... – g19fanatic 2012-08-22 03:29:21
老實說,我讀了你的問題3次,並且仍然不明白你在描述什麼。我認爲這發生在大多數讀者身上,這就是爲什麼你沒有得到答覆。你確實需要簡化一些東西。此外,它真的感覺你正在構建一些複雜的東西,在那裏可以更容易的解決方案。 – Codeguard 2012-08-22 12:38:07