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

Posted lvhuatblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的值的主要内容,如果未能解决你的问题,请参考以下文章

在不反序列化的情况下操作 JSON

JSONKit 不反序列化不带引号的属性

我可以将匿名类型序列化为 xml 吗?

如何在不反编译的情况下更改已编译的 .class 文件?

如何在不创建大缓冲区的情况下将 .NET 对象的大图序列化为 SQL Server BLOB?

Jackson:如何在不修改 POJO 的情况下向 JSON 添加自定义属性