首頁  >  文章  >  Java中常見欄位的Protobuf部分序列化

Java中常見欄位的Protobuf部分序列化

WBOY
WBOY轉載
2024-02-12 15:45:061181瀏覽

問題內容

我有一條 protobuf 訊息,需要傳送給多個客戶端。該訊息對於每個客戶端具有相同的數據,除了一個欄位(序號)對於每個客戶端來說是不同的。現在,我可以更改生成的 Java 訊息物件中的字段,並分別為每個客戶端序列化訊息。但是有沒有一種方法可以序列化除一個欄位之外的所有內容,然後僅為每個客戶端序列化該欄位(例如,交換序列化訊息中的對應位元組或其他內容)?

編輯:我見過 mergeFrom 方法來合併兩個訊息,但根據我的理解,它首先解析訊息,然後交換數據,然後您可以再次序列化它,所以根本不是性能優化(?)。

解決方法

首先,我想非常確定這實際上與效能相關。如果協定緩衝區訊息不大(如果它們不是多個千字節,我什至不會考慮這一點),那麼我預計這對效能的影響基本上為零,並且您甚至不應該嘗試優化它.

假設您已將其視為瓶頸,那麼這並不難。連接序列化原型構造合併形式,所以大概這就是

myMessage.toBuilder().clearSpecialField().build().writeTo(outputStream);
MyMessage.newBuilder().setSpecialField(...).build().writeTo(outputStream);

(如果您已將 special_field 作為必填欄位(違反最佳實踐),那麼您可能需要改用 buildPartial。)

然後你將其作為一條原始訊息讀取

MyMessage.parseFrom(inputStream);

以上是Java中常見欄位的Protobuf部分序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除