我有一條 protobuf 訊息,需要傳送給多個客戶端。該訊息對於每個客戶端具有相同的數據,除了一個欄位(序號)對於每個客戶端來說是不同的。現在,我可以更改生成的 Java 訊息物件中的字段,並分別為每個客戶端序列化訊息。但是有沒有一種方法可以序列化除一個欄位之外的所有內容,然後僅為每個客戶端序列化該欄位(例如,交換序列化訊息中的對應位元組或其他內容)?
編輯:我見過 mergeFrom 方法來合併兩個訊息,但根據我的理解,它首先解析訊息,然後交換數據,然後您可以再次序列化它,所以根本不是性能優化(?)。
首先,我想非常確定這實際上與效能相關。如果協定緩衝區訊息不大(如果它們不是多個千字節,我什至不會考慮這一點),那麼我預計這對效能的影響基本上為零,並且您甚至不應該嘗試優化它.
假設您已將其視為瓶頸,那麼這並不難。連接序列化原型構造合併形式,所以大概這就是
myMessage.toBuilder().clearSpecialField().build().writeTo(outputStream); MyMessage.newBuilder().setSpecialField(...).build().writeTo(outputStream);
(如果您已將 special_field
作為必填欄位(違反最佳實踐),那麼您可能需要改用 buildPartial
。)
然後你將其作為一條原始訊息讀取
MyMessage.parseFrom(inputStream);
以上是Java中常見欄位的Protobuf部分序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!