【Golang】如何不反序列化為前提的情況下,修改ProtoBuffer某個Tag的值
當你從客戶端接收到一串序列化後的數據,你需要
- 修改其中某一個標簽的值,然後把它傳遞到真正的業務數據,這樣每個業務模塊(微服務)就不需要和公共授權服務打交道了。
- 因為傳遞的數據的長度,類型甚至是新的字段的新增的造成不穩定,因此 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的值