当前位置: 首页 > news >正文

Protobuf工具

       #region 知识点一 什么是 Protobuf
        //Protobuf 全称是 protocol - buffers(协议缓冲区)
        // 是谷歌提供给开发者的一个开源的协议生成工具
        // 它的主要工作原理和我们之前做的自定义协议工具类似
        // 只不过它更加的完善,可以基于协议配置文件生成
        //C++、Java、C#、Objective - C、PHP、Python、Ruby、Go
        // 等等语言的代码文件

        // 它是商业游戏开发中常常会选择的协议生成工具
        // 有很多游戏公司选择它作为协议工具来进行网络游戏开发
        // 因为它通用性强,稳定性高,可以节约出开发自定义协议工具的时间

        //protocol - buffers 官网
        //https://developers.google.com/protocol-buffers
        #endregion
        #region 知识点二 Protobuf 的使用流程
        //1. 下载对应语言要使用 Protobuf 相关内容
        //2. 根据配置规则编辑协议配置文件
        //3. 用 Protobuf 编译器,利用协议配置文件生成对应语言的代码文件
        //4. 将代码文件导入工程中进行使用
        #endregion
        #region 知识点三 下载 Protobuf 相关内容 — 准备 DLL 文件
        //1. 在官网中前往下载地址
        // protocol - buffers 官网
        // https://developers.google.com/protocol-buffers
        //2. 下载 protobuf - csharp
        //3. 解压后打开 csharp\src 中的 Google.Protobuf.sln
        //4. 选择 Google.Protobuf 右键生成 dll 文件
        //5. 在 csharp\src\Google.Protobuf\bin\Debug 路径下找到对应.net 版本的 Dll 文件(我们使用 4.5 即可)
        //6. 将 net45 中的 dll 文件导入到 Unity 工程中的 Plugins 插件文件夹中
        #endregion
        #region 知识点四 下载Protobuf相关内容—准备编译器
        //1.在官网中前往下载地址
        //  protocol - buffers官网
        //  https://developers.google.com/protocol-buffers
        //2.下载protoc - 版本 - win32或者64(根据操作系统而定)
        //3.解压后获取bin文件夹中的protoc.exe可执行文件,
        //  可将其放入Unity工程中,方便之后的使用(你也可以不放入Unity工程,记住它的路径即可)
        #endregion
        #region 总结
        //Protobuf全称protocol-buffers
        //是谷歌提供给开发者的开源协议生成工具

        //我们要使用它主要准备两步
        //1. 下载对应Csharp版本,生成DLL包文件导入工程中(之后的基类,序列化反序列化都基于DLL包中写好的内容)
        //2. 下载对应操作系统的protoc编译器,用于之后生成代码文件(之后根据配置文件生成代码都是通过该应用程序)
        #endregion

      #region 知识点一 回顾自定义协议生成工具中的配置文件//我们在自定义协议配置工具相关知识点中//使用的是xml文件进行配置//我们只需要基于xml的规则//按照一定规则配置协议信息//之后获取xml数据用于生成代码文件//在Protobuf中原理是一样的//只不过Protobuf中有自己的配置规则//也自定义了对应的配置文件后缀格式#endregion#region 知识点二 配置后缀//Protobuf中配置文件的后缀统一使用//.proto//可以通过多个后缀为.proto的配置文件进行配置#endregion#region 知识点三 配置规则#region 规则1 注释方式//方式1/*方式2*/#endregion#region 规则2 第一行版本号//syntax = "proto3";//如果不写 默认使用proto2#endregion#region 规则3 命名空间//package 命名空间名;#endregion#region 规则6 特殊标识//1:required 必须赋值的字段//2:optional 可以不赋值的字段//3:repeated 数组//4.map 字典#endregion#region 规则7 枚举//enum 枚举名{//    常量1 = 0;//第一个常量必须映射到0//    常量2 = 1;//}#endregion#region 规则8 默认值//string-空字符串//bytes-空字节//bool-false//数值-0//枚举-0//message-取决于语言 C#为空#endregion#region 规则9 允许嵌套#endregion#region 规则10 保留字段//如果修改了协议规则,删除了部分内容//为了避免更新时,重新使用已经删除了的编号//我们可以利用 reserved 关键字来保留字段//这些内容就不能再被使用了//message Foo {//    reserved 2, 15, 9 to 11;//    reserved "foo", "bar";//}#endregion#region 规则11 导入定义//import "配置文件路径";//如果你在某一个配置中,使用了另一个配置的类型//则需要导入另一个配置文件名#endregion#endregion#region 总结//我们需要掌握Protobuf的配置规则//之后才能使用工具将其转化为C#脚本文件#endregion 

test.proto和test2.proto文件

//规则二:版本号
syntax="proto3";//决定了proto文档的版本号//规则一:注释方式
//注释方式一
/*注释方式二*/ //规则十一: 导入定义
import "test2.proto";
//规则三:命名空间
package GamePlayerTest;//这决定了命名空间//规则四:消息类
message TestMsg{//规则五:成员类型和唯一编号//浮点数// =1不代表默认值,而是代表唯一号 方便我们进行序列化//required - 必须赋值的字段 proto2//optional - 可以不赋值的字段//requiredfloat testF = 1;//C#-float  optional double testD = 2;//C#-double //变长编码//所谓变长 就是会根据 数字的大小 来使用对应的字节数来存储//Protobuf帮助我们优化的部分 可以尽量少的使用字节数 来存储内容int32 testInt32 = 3;//C#-int 它不太适用于表示负数 请使用sint32//1 2 4 8int64 testInt64 = 4;//C#-long 它不太适用于表示负数 请使用sint64//更实用表示负数类型的的整形sint32 testSInt32 = 5;//C#-int 适用于表示负数的整形sint64 testSint64 = 6;//C#-long 适用于表示负数的整形//无符号 变长编码//1  2 4 uint32 testUInt32 = 7;//C#-uint 变长的编码uint64 testUInt64 = 8;//C#-ulong 变长的编码//固定字节数的类型fixed32 testFixed32 = 9;//C#-uint 它通常表示大于2的28次方的数,比uint32更有效 始终是4个字节fixed64 testFixed64 = 10;//C#-ulong 它通常表示大于2的56次方的数,比uint64更有效 始终是8个字节sfixed32 testSFixed32 = 11;//C# - int 始终是4个字节 sfixed64 testSFixed64 = 12;//C# - long 始终是8个字节//其它类型bool testBool = 13;//C#-boolstring testStr = 14;//C#-stringbytes testBytes = 15;//C# - BytesString 字节字符串//数组Listrepeated int32 listInt = 16;//C# - 类似List<int>的使用//字典Dictionary map<int, string> testMap = 17; //C# - 类似Dictionary<int,string>的使用//枚举成员变量的声明 需要唯一编码TestEnum testEnum = 18;//声明自定义类对象 需要唯一编码//默认值是nullTestMsg2 testMsg2 = 19;//嵌套一个类在另一个类中 相当于是内部类message TestMsg3{int32 testInt32 =1;}TestMsg3 testMsg3 = 20;enum TestEnum2{NORMAL = 0;//第一个常量必须映射到0BOSS = 1;}TestEnum2 testEnum2 = 21;//int32 testInt323333 = 22;bool testBool34555 = 23;GameSystemTest.HeartMsg testHeart = 24;//告诉编译器 22 被占用 不准用户使用//之所以有这个功能 是为了在版本不匹配时 反序列化时 不会出现结构不统一//解析错误的问题reserved 22;reserved "testInt323333";}
//枚举的申明
enum TestEnum{NORMAL = 0;//第一个常量必须映射到0BOSS = 5;
}
message TestMsg2{int32 testInt32 =1;
}
syntax="proto3";//决定了proto文档的版本号
package GameSystemTest;//这决定了命名空间 
message HeartMsg
{int64 time = 1;
}

相关文章:

  • C语言 ——— 函数栈帧的创建和销毁
  • Kafka 解惑
  • 你对于JVM底层的理解
  • Python面向对象编程(OOP)深度解析:从封装到继承的多维度实践
  • Room持久化库:从零到一的全面解析与实战
  • 5. 动画/过渡模块 - 交互式仪表盘
  • 车载网关作为车辆网络系统的核心枢纽
  • spark MySQL数据库配置
  • 基于 Amazon Bedrock 和 Amazon Connect 打造智能客服自助服务 – 设计篇
  • 涌现理论:连接万物的神秘力量
  • Kafka、RabbitMQ、RocketMQ的区别
  • 地址簿模块-01.需求分析
  • python训练营day23
  • Spark,RDD中的行动算子
  • 深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案
  • 正则表达式常用验证(一)
  • 【python】—conda新建python3.11的环境报错
  • 无人机信号监测系统技术解析
  • 【Java】网络编程(Socket)
  • Mac上安装Mysql的详细步骤及配置
  • 法治课|争议中的“行人安全距离”于法无据,考量“注意义务”才更合理
  • 韩国总统选战打响:7人角逐李在明领跑,执政党临阵换将陷入分裂
  • 上海护师邢红获第50届南丁格尔奖,她为何能摘得护理界最高荣誉
  • 中国科学院院士徐春明不再担任山东石油化工学院校长
  • 富家罹盗与财富迷思:《西游记》与《蜃楼志》中的强盗案
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”