结论
- 常用字段、热点字段的字段编号,应该尽量小于15
- 如果数值可能为负数,应定义为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);
}

629

被折叠的 条评论
为什么被折叠?



