Protobuf工具

发布于:2025-05-13 ⋅ 阅读:(8) ⋅ 点赞:(0)

       #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 - 可以不赋值的字段
    //required
    float testF = 1;//C#-float  
    optional double testD = 2;//C#-double 

    //变长编码
    //所谓变长 就是会根据 数字的大小 来使用对应的字节数来存储
    //Protobuf帮助我们优化的部分 可以尽量少的使用字节数 来存储内容
    int32 testInt32 = 3;//C#-int 它不太适用于表示负数 请使用sint32
    //1 2 4 8
    int64 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#-bool
    string testStr = 14;//C#-string
    bytes testBytes = 15;//C# - BytesString 字节字符串

    //数组List
    repeated int32 listInt = 16;//C# - 类似List<int>的使用
    //字典Dictionary 
    map<int, string> testMap = 17; //C# - 类似Dictionary<int,string>的使用

    //枚举成员变量的声明 需要唯一编码
    TestEnum testEnum = 18;

    //声明自定义类对象 需要唯一编码
    //默认值是null
    TestMsg2 testMsg2 = 19;

    //嵌套一个类在另一个类中 相当于是内部类
    message TestMsg3{
        int32 testInt32 =1;
    }
    TestMsg3 testMsg3 = 20;
    enum TestEnum2{
        NORMAL = 0;//第一个常量必须映射到0
        BOSS = 1;
    }
   TestEnum2 testEnum2 = 21;

   //int32 testInt323333 = 22;

   bool testBool34555 = 23;

   GameSystemTest.HeartMsg testHeart = 24;

   //告诉编译器 22 被占用 不准用户使用
   //之所以有这个功能 是为了在版本不匹配时 反序列化时 不会出现结构不统一
   //解析错误的问题
   reserved 22;
   reserved "testInt323333";
   }
//枚举的申明
enum TestEnum{
    NORMAL = 0;//第一个常量必须映射到0
    BOSS = 5;
}
message TestMsg2{
     int32 testInt32 =1;
}

syntax="proto3";//决定了proto文档的版本号
package GameSystemTest;//这决定了命名空间 
message HeartMsg
{
	int64 time = 1;
}


网站公告

今日签到

点亮在社区的每一天
去签到