2011-05-10 79 views
6

可以有這樣的消息嗎?protobuf消息中的自引用字段

message A { 
    required int64 some_number = 1; 
    // .... some more fields 
    optional A sub_a = 123; 
} 

原因是把我當前協議的商店裏直接和包裹A在另一條消息會導致存儲的海量數據轉換。

2.2.0 protoc編譯好了。 這可以使序列化/反序列化的任何問題,並由protobuf網支持。

回答

7

這是一個完全正常的定義,應該在任何實現工作(包括protobuf網);你有沒有看到任何問題?然而!您可能需要考慮序列化的計算影響 - 特別是序列化子消息時,需要知道子消息的大小第一個。深度遞歸的方法(如該鏈接列表所需)可能會導致一些問題。

是否有任何理由不能只是一個repeated消息呢?那到目前爲止是我的偏好。

+0

當前協議正在發送和存儲A消息,而不是重複A字段的包裝器B.改變協議更加有效,然後僅向A添加字段。在B情況下,我需要將所有存儲的數據轉換爲新的消息類型或支持A和B消息。 – 2011-05-10 08:51:33

2

我不知道protobuf網,但它應該是絕對好的。我懷疑,如果它確實在protobuf網不工作,馬克將計爲一個錯誤,並修復它......這是肯定我會帶我的C#端口:)

(實事求是的態度,我不能很容易地看到這將是一個問題......它不像消息將由結構表示,遞歸會成爲一個問題。)

它應該很容易測試 - 我建議你試試一下,看看是否遇到任何問題。你真正需要做的就是創建一條消息,並測試你是否可以正確序列化和反序列化它,可能是在不同的平臺之間。

編輯:顯然,你需要確保有沒有實際的週期在消息本身而言...

+0

我可以看到一些問題,如果這(鏈表)過長... – 2011-05-10 05:41:31

+0

我測試它與谷歌的實施,而不是protobuf網側,我沒有太多的訪問。 – 2011-05-10 08:48:16

+0

它工作正常順便說一句:) – 2011-05-10 08:48:33