1. 程式人生 > >【Golang】如何不反序列化為前提的情況下,修改ProtoBuffer某個Tag的值

【Golang】如何不反序列化為前提的情況下,修改ProtoBuffer某個Tag的值

刪除 tag mage msg 挑戰 客戶 Golan protobuff 直接

技術分享圖片

當你從客戶端接收到一串序列化後的數據,你需要

  - 修改其中某一個標簽的值,然後把它傳遞到真正的業務數據,這樣每個業務模塊(微服務)就不需要和公共授權服務打交道了。

  - 因為傳遞的數據的長度,類型甚至是新的字段的新增的造成不穩定,因此 network->originBytes - > Marshal() -> Object -> Unmarshal()->newBytes->Logic Service 會造成很大的損耗

因此設想是否考慮一個優化方式: network->originBytes -> Modify()->newBytes->Logic Service

設計到的操作可能有:修改Tag對應值,刪除Tag對應值,新增Tag對應值

挑戰在於:

  - 需要對ProtoBuffer的編碼熟知(本文不提,自行查閱相關資料),當然也可以直接從Proto庫拷貝代碼出來使用

- ProtoBuffer的類型值是變長的 int64(1024*1024*1024) 和 int64(1024)編碼後的長度不是相同的,因此不能單純地在原來的[]byte進行修改。

本文不考慮一些復雜類型的修改,僅修改基本的類型,假設你有一個Message

message SubMsg {

uint32 un32 = 1;

}

message MyMsg {

string str = 1;

  int32 n32 = 2;

float64 f64 = 3;

  repeated int64 n64 = 4;

  SubMsg subMessage = 5;

}

// 未完待續

【Golang】如何不反序列化為前提的情況下,修改ProtoBuffer某個Tag的值