一、protobuf概述
1、优点
数据更小,解析速度更快。
2、语法规则
数据结构是标量数据类型
每一个字段都有唯一的标识符,[1,15]是1个字节,[16,2047]是2个字节。标识符为32位整数,[1,2,147,483,647]。保留标识符1、2、15、[19000,19999]
字段规则,
rquired:必须填写内容的字段,已经废弃,不建议使用
optional:可选字段,默认的选项
repeated:声明类似于数组的字段
3、数据类型
数据类型 | 数据 |
整数 | int32:32 位整数。 int64:64 位整数。 uint32:无符号 32 位整数。 uint64:无符号 64 位整数。 sint32:有符号的变长编码 32 位整数。 sint64:有符号的变长编码 64 位整数。 fixed32:固定 32 位整数。 fixed64:固定 64 位整数。 sfixed32:有符号的固定 32 位整数。 sfixed64:有符号的固定 64 位整数。 |
浮点数 | float:单精度浮点数。 double:双精度浮点数。 |
布尔 | bool:布尔值,可以是 true 或 false。 |
字符串 | string:UTF-8 编码的文本字符串。 |
字节数组 | bytes:字节数组,用于表示原始二进制数据。 |
枚举 | enum:枚举类型,用于表示一组有限的选择。 |
消息 | message:自定义消息类型,可以嵌套在其他消息中,用于表示复杂的数据结构。 |
嵌套 | ProtoBuf 支持在消息中嵌套其他消息类型,从而创建更复杂的数据结构。 |
特殊 | null:在 ProtoBuf 中没有明确的 “null” 值,但可以使用 default 关键字来表示默认值。 |
4、工具描述
proroc-gen:将proto文件转换成cs文件
protogen Test.proto --csharp_out=/Users/zhaoxingxu/Desktop/
二、安装
MACOS
brew install protobuf
brew install protoc-gen-go
dotnet tool install --global protobuf-net.Protogen
三、文件格式
1、文件拓展名
.proto
syntax="proto2";//
message messageA {//一个消息,类似于一个数据类
optional int32 msgID = 3 [default = -1];//可选类型的int32,标识符为3,默认值为-1
optional string msg = 4;//可选类型的字符串,标识符是4
enum messageType {//定义一个枚举数据类型
SUCCRESS = 1;
RUNNING = 2;
FAILURE = 3;
}
optional messageType type = 5;//一个枚举,标识符为5
}
2、使用cs定义数据类
using ProtoBuf;
[ProtoContract]
public class MsgData
{
[ProtoMember(3)]
public int msgID { get; set; }
[ProtoMember(4)]
public string msgData { get; set; }
}
3、对数据进行序列化
byte[] cache;
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, msgData);
cache = ms.ToArray();
}
4、对数据进行反序列化
using (MemoryStream ms = new MemoryStream(cache))//cache是一个字节数组
{
MsgData msgData1 = ProtoBuf.Serializer.Deserialize<MsgData>(ms);
print(msgData1.msgID);
}
终、一些其他的内容
1、版本
ProtoBuf 2(proto2):
- 可选、必须和重复字段:Proto2 引入了
optional
、required
和repeated
关键字来定义字段的出现规则。这些关键字使字段的存在变得更加明确。 - 默认值:Proto2 中的字段有默认值,如果字段未设置,它将具有默认值。这在某些情况下可能导致混淆。
- 扩展:Proto2 支持扩展字段,允许在不破坏现有消息定义的情况下向消息中添加字段。
- 枚举:Proto2 中的枚举使用
enum
关键字定义。 - 字段名称和标识符:字段的标识符可以是任意整数,而字段的名称在消息中是唯一的。
ProtoBuf 3(proto3):
- 可选性:Proto3 中引入了更简化的可选性概念。所有字段都是可选的,不再有
optional
和required
关键字。 - 默认值:Proto3 中的字段不再具有默认值,因此未设置字段将不包含默认值,而是表示缺失。
- 扩展:Proto3 不再支持扩展字段,字段必须在消息定义中显式声明。
- 枚举:Proto3 中的枚举使用
enum
关键字,与 Proto2 类似。 - 字段名称和标识符:Proto3 中的字段标识符必须是正整数,并且在消息中是唯一的。Proto3 中去除了字段名称的概念。
- 清理字段:Proto3 引入了
oneof
关键字,用于表示一组字段中只能有一个字段有值,其他字段自动清除。 - 删除字段:Proto3 中删除了一些 Proto2 中的冗余特性,以简化语法。
一些文件
Unity的dll文件,放到Assets文件夹下Plugins文件夹下。
留言