一、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):

  1. 可选、必须和重复字段:Proto2 引入了 optionalrequiredrepeated 关键字来定义字段的出现规则。这些关键字使字段的存在变得更加明确。
  2. 默认值:Proto2 中的字段有默认值,如果字段未设置,它将具有默认值。这在某些情况下可能导致混淆。
  3. 扩展:Proto2 支持扩展字段,允许在不破坏现有消息定义的情况下向消息中添加字段。
  4. 枚举:Proto2 中的枚举使用 enum 关键字定义。
  5. 字段名称和标识符:字段的标识符可以是任意整数,而字段的名称在消息中是唯一的。

ProtoBuf 3(proto3):

  1. 可选性:Proto3 中引入了更简化的可选性概念。所有字段都是可选的,不再有 optionalrequired 关键字。
  2. 默认值:Proto3 中的字段不再具有默认值,因此未设置字段将不包含默认值,而是表示缺失。
  3. 扩展:Proto3 不再支持扩展字段,字段必须在消息定义中显式声明。
  4. 枚举:Proto3 中的枚举使用 enum 关键字,与 Proto2 类似。
  5. 字段名称和标识符:Proto3 中的字段标识符必须是正整数,并且在消息中是唯一的。Proto3 中去除了字段名称的概念。
  6. 清理字段:Proto3 引入了 oneof 关键字,用于表示一组字段中只能有一个字段有值,其他字段自动清除。
  7. 删除字段:Proto3 中删除了一些 Proto2 中的冗余特性,以简化语法。

一些文件

Unity的dll文件,放到Assets文件夹下Plugins文件夹下。

最后修改日期: 2023年10月11日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。