Protobuf根据Varint编码优化序列化

结论

  1. 常用字段、热点字段的字段编号,应该尽量小于15
  2. 如果数值可能为负数,应定义为sint

Protobuf具体实现可以看文档,里面讲的很清楚了。

代码示例

syntax = "proto3";

message Test1 {
  int32 a = 15;
}

message Test2 {
  int32 a = 16;
}

message Test3 {
  sint32 a = 15;
}
 private static void PrintHex(IMessage message)
 {
     // 序列化到内存流
     byte[] serializedBytes;
     using (var stream = new MemoryStream())
     {
         message.WriteTo(stream);
         serializedBytes = stream.ToArray();
     }

     // 打印十六进制字节(空格分隔,大写)
     var hex = BitConverter.ToString(serializedBytes).Replace('-', ' ');
     Console.WriteLine(hex);
 }

 // 基础示例,message变量序列化后是3个字节
 public static void Run()
 {
     var message = new Test1 { A = 150 };
     // 输出: 78 96 01
     PrintHex(message);
 }

 // Tag = (字段编号 << 3) | wire_type。并且一个字节只有低 7 位用来存数据,最高位是标志位。因此Tag(字段键)在字段编号(Field Number)大于等于 16 时,会大于 1 个字节。
 public static void Run2()
 {
     var message = new Test2 { A = 150 };
     // 输出: 80 01 96 01
     PrintHex(message);
 }

 // -1用int32和sint32的区别
 public static void Run3()
 {
     var message = new Test1 { A = -1 };
     // 78 FF FF FF FF FF FF FF FF FF 01
     PrintHex(message);

     var message2 = new Test3 { A = -1 };
     // 78 01
     PrintHex(message2);
 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值