2017-08-14 48 views
2

我正在尋找使用Google Protobuffers三角洲消息。意思我只想發送我的域對象的改變的值。使用谷歌protobuffer三角洲消息

但是這暴露了與此協議有關的問題。我可以很容易地忽略那些沒有改變的屬性,這會給我們提供一個緊湊的信息。

但是如何將屬性值從_something_更改爲null?在協議緩衝區中無法區分這兩種情況。

其他人在這裏做了什麼?我在看幾個不同的解決方案:

  1. 一個元屬性添加到所有對象,這是一個int數組。如果任何屬性應該更改爲空,請在此數組中包含字段編號。如果沒有屬性改變,那麼meta屬性被省略,並且不佔用消息中的帶寬。

  2. 添加一個元屬性,它是一個位掩碼,但是像選項1中提到的數組一樣工作。這對於客戶來說可能更難理解。

  3. 使用我還找不到的標準方式。

BR周杰倫

回答

0

的Protobuf 3是不是很適合這個。但在protobuf 2中,您可以有一個存在的字段,但其值爲null。

因爲protobuf 2不會很快消失,所以我建議只用它來達到這種目的。

0

我只是想發佈一個後續行動,並解釋我做了什麼。

由於@jpa正確指出原型操縱符不是用於增量壓縮的。

所以我解決它的方式是使用一些元屬性,並依靠該約定。我與消費數據的人員有着密切的合作關係,因此可以就約定達成一致。是專門設置爲空

  1. 值I增加了一個int數組到的消息。此int數組大多數時間爲空,並且不會影響消息大小。當一個屬性設置爲null時,我會將屬性標籤添加到該數組中,並且這種方式表明它在該消息更新中專門設置爲null。

  2. 陣列被清空

    這工作以同樣的方式作爲空值數組。我在消息中添加了一個int數組。此int數組大多數時間爲空,並且不會影響消息大小。當一個數組被清空時,我會將property標籤添加到這個數組中,並且這種方式表明它已經專門清空了那個消息更新。被刪除的

    要指示一個對象已被刪除

  3. 對象,我已經添加了一個布爾屬性指示該對象已被刪除。當對象被刪除時,我會將此值設置爲true,否則爲空,所以它不佔用消息中的空間。結果消息是該對象的關鍵標識符,並且布爾值指示它被刪除。

它要求約定由客戶理解,但否則它工作得很好。