【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;

}

// 未完待续

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

时间: 2024-11-05 18:50:41

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

保留键的情况下取字典中最大的值(max\zip函数的联合使用)

在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age2":6,"age2":100} v1 = max(testDict.values()) print(v1) #打印结果为100 这样已经达到了获取最大值的目的,但是这样就丢失了key.要如何保留key呢,这就需要用到zip函数 zip函数的作用是将两个序列以顺序对应起来,最后生

不修改模板的前提下修改VisualState中的某些值

UWP里有一件非常令人不爽的事,大部分控件只提供了Normal状态下的Background,Foreground,BorderBrush,而控件一般至少具有Normal.PointerOver.Pressed.Disabled,ItemContainerStyle还有Selected.PointerOverSelected.PressedSelected这几种.那么常规方法怎么修改这几个状态内的值呢? 当然是贴一遍又臭又长的Style. 那如果有很多不是很一样的控件,除了修改模板或者自定义一个控

在不使用第三方参数的情况下交换两个参数的值

//方法一 i = i + j; j = i - j; i = i - j; //方法二 i ^= j; j ^= i; i ^= j; //方法三 a = a + b - (b = a)

编辑器拓展七——不实例化的情况下修改Assets下面的文件

描述 1.今天接了个任务,因为公司的项目展示界面的人物与武器都用了standard与standard(specular steup),这个两个自带的材质球是带雾效的,然后收到场景的影响 在ui界面 角色跟枪械都受到雾效的影响 ,需要将它换成不受雾效影响的shader.于是将这两个shader的源码改了一下,新加在项目中,接下来问题就来了,美术一个一个 去替换?那么多角色枪械如何贴换?如何能做到完全替换?只能靠工具才能完美解决 2.方案 1.要把所有用了这两个shader的材质球路径找出来  通过

不停止kfaka服务的情况下修改kafka某个topic的数据保存时间

./kafka-topics.sh --zookeeper zk1:2181 -topic topicname --alter --config retention.ms=86400 原文地址:http://blog.51cto.com/haoyonghui/2119142

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象 。

JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象.要添加System.Web.Extensions.dll的引用.该类位于System.Web.Script.Serialization命名空间下. 一.属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度. Recursio

将Json反序列化为泛型List

Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现. 假设一个List<A>的对象被序列化为一个json,如果采用如下方式: {code}List<A> aList = new ArrayList<A>;objectMapper.readValue(json,aList.class);{code}如上的反序列化方式,虽然能够成功,但是A类型实际上会被

Android中序列化对象到XMl 和 XML反序列化为对象

package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; imp

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象.要添加System.Web.Extensions.dll的引用.该类位于System.Web.Script.Serialization命名空间下. 一.属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度. Recursio