码迷,mamicode.com
首页 > 其他好文 > 详细

【Golang】如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值

时间:2018-05-11 12:48:14      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:图片   反序   接收   删除   oat   ESS   mars   logic   http   

 

技术分享图片

 

当你从客户端接收到一串序列化后的数据,你需要

  - 修改其中某一个标签的值,然后把它传递到真正的业务数据,这样每个业务模块(微服务)就不需要和公共授权服务打交道了。

  - 因为传递的数据的长度,类型甚至是新的字段的新增的造成不稳定,因此 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的值

标签:图片   反序   接收   删除   oat   ESS   mars   logic   http   

原文地址:https://www.cnblogs.com/lvhuatblog/p/9023150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!