2016-09-22 35 views
2

如果我定義:如何未在protocbuf分配的值可選字段被分配空間

message A { 
required int32 first = 1; 
optional int32 second = 2; 
} 

的空間的尺寸時set_second(0),則serializeToArray()是不相同的條件是當set_second(14353355445 )然後serializeToArray()

有沒有辦法讓它們具有相同的空間大小?

在其他方面,我怎樣才能使未分配值的可選字段具有相同大小的空間,就像它們被賦值一樣?

+0

不要使用protobuf?這是protobuf的目的。找一些其他的序列化庫。 –

+0

@DarkFalcon使用protobuf作爲序列化庫沒有任何問題。 –

+1

@πάνταῥεῖ:我沒有說有。我說如果他希望總是包含問題*中提到的所有字段*,那麼股票protobuf庫可能不會發生這種情況。 –

回答

0

這是encoded in a special way節省帶寬,因此不同的整體大小。如果您希望/需要它始終具有相同的大小,您可以選擇使用fixed32字段類型。


但是,您應該注意,如果您根本沒有爲可選字段設置值,則序列化大小會再次有所不同。

+0

請注意,這仍然不會強制消息中出現可選字段。 –

+0

@DarkFalcon實質上是這樣,但OP提到'set_second(0)'。大小的差異來自編碼機制。 –

+0

OP還說「未分配值的可選字段」。無論如何,從proto3開始,甚至明確地將其設置爲默認值,似乎不再發送它:「行爲在proto2和proto3之間改變。在proto3下,不再有單獨的」存在「概念。只有當它不等於其默認值時,字段纔會在電線上發送。「 http://stackoverflow.com/questions/9168052/how-do-has-field-methods-relate-to-default-values-in-protobuf –

1

我的建議是:不要試圖用Protobuf做到這一點。 Protobuf的設計不是爲了給你固定的或者可預測的尺寸,所以如果這就是你想要的,那麼Protobuf就不適合這項工作。

當然,您可以像使用fixed32一樣使用黑客技巧,並嘗試確保您的字段始終具有非默認值,但是您正在與您的工具作鬥爭。未來可能會發生其他變化,使尺寸再次變得不可預測。最好選擇一款符合您需求的工具。

+0

嘿肯頓protobuf的創造者。深深的敬意。 OP給我發了[最近的評論](http://stackoverflow.com/questions/39644416/how-can-optional-fields-that-are-not-assigned-values-in-protocbuf-be-allocated-s/39644611?noredirect = 1#comment66607593_39644611)確認了它的XY問題。IMO protobuf似乎對他們來說是完美的。他們需要儘可能小的空間,而不是固定的大小。 –

+0

你讓我的專業生產代碼像魅力一樣運行!再次深深地拜拜。 –

+0

(我實際上懷疑OP根本不需要固定寬度,但很難說沒有更多細節。) –