• 通讯协议及Google.Protobuf(三)生成c#代码 序列及反序列化


    下载protoc.exe 用于生成c# 代码,地址:https://github.com/protocolbuffers/protobuf/releases

    下载的版本最好和Google.Protobuf.dll 版本一致。

    解压之后,我们在bin目录下编写一个简单的test1.proto:

    1 syntax = "proto3";
    2 //package TestProto;  根据实际情况是否需要命名空间
    3 
    4 message test1
    5 {
    6     string name = 1;//姓名
    7     int32 age = 2;//年龄
    8     string sex = 3;//性别
    9 }

    在protoc-3.7.0-win32文件夹同级目录下我们编写2个批处理文件

     

     exportProto.bat:用于导出proto协议文件,会调用 createProto.bat

    @echo off
    
    setlocal enabledelayedexpansion 
    set curPath=I:\protobuf\protobufCreateCSharpSourcePackages
    cd /d %curPath%
    call createProto.bat
    pause

    createProto.bat:用于最终生成c#、pb文件(pb用于lua 会面我们会将),生成的c#/、pb文件会存放在cSharpProto 、pbProto文件夹内

    @echo off
    
    set cSharpPath = protoc-3.7.0-win32\bin\cSharpProto
    set pbPath = protoc-3.7.0-win32\bin\pbProto
    
    if not exist %pbPath (
        md protoc-3.7.0-win32\bin\pbProto
    ) else (
        echo pbProto is Exist
    )
    
    if not exist %cSharpPath (
        md protoc-3.7.0-win32\bin\cSharpProto
    ) else (
        echo cSharpProto is Exist
    )
    
    cd protoc-3.7.0-win32\bin
    for %%i in (*.proto) do (
        protoc --csharp_out=./ %%i
        protoc -o %%~ni.pb %%i    
        echo From %%i To %%~ni.cs Successfully!
        echo From %%i To %%~ni.pb Successfully!
        move %%~ni.cs cSharpProto
        move %%~ni.pb pbProto
    )

    使用的时候:只需要双击exportProto.bat即可

    结果如下:

     

     

     至此生成代码完成。

    把生成的c#代码 导入到我们unity工程中,测试序列化及反序列化:

    1 test1 proto3 = new test1();
    2 proto3.Age = 10;
    3 proto3.Sex = "girl";
    4 proto3.Name = "xiaoming";
    5 msgData = proto3.ToByteArray();
    6 Debug.LogError("msgData .Length = " + msgData.Length);//打印长度 18

    注意:这里的转化为byte数组,长度只有18  比 通讯协议及Google.Protobuf(一)中我们自定义struct 数据大小要小。

    ToByteArray():这里要引入using Google.Protobuf; 用的是Google.Protobuf 里面的接口。

    反序列化:

    1 test1 protoMsg = test1.Parser.ParseFrom(msgData);
    2 string name1 = protoMsg.Name;
    3 int age1 = protoMsg.Age;
    4 string Sex1 = protoMsg.Sex;
    5 Debug.LogError(string.Format("name1 = {0},age1={1},JobId1 ={2}", name1, age1, Sex1));

    Parser.ParseFrom 也是Google.Protobuf.dll 为我们提供的接口。

    感兴趣的朋友可以下载源码,源码里面有个例子,可以查看。地址还是上面的地址,下载c#版 。

     

     

    总结:

    1.使用Google.Protobuf,序列化后的数据包 相对struct  更小。

    2.使用Google.Protobuf 更省心。不用写协议生成工具,只需写批处理即可。比如 协议内的数组 ,Protobuf 已有关键字支持。

     

    关于 通讯协议及Google.Protobuf c#版本就到此结束了,后面我们会讲解在lua中如何使用pb文件、序列化与反序列化。

  • 相关阅读:
    vue基础指令了解
    django中间件和auth模块
    form组件及cookie和session
    ajax学习相关
    数据库优化查询相关
    Django ORM必会13条之外的查询方法
    Django ORM单表查询必会13条
    Django学习之路05
    Django学习之路04
    Django学习之路03
  • 原文地址:https://www.cnblogs.com/zhaolaosan/p/16382369.html
Copyright © 2020-2023  润新知