Protobuf 使用

Protobuf 使用

Protobuf 概念以及干什么的就不在这里说了,看这篇文章的应该都了解了,不了解的可以自己查一下。

总共分三步
第一步:下载配置 Protobuf 环境
Protobuf github 下载链接
里面有各个版本的 package,记得要选 release,根据自己需求找到适合的版本
我这里使用的是 Protocol Buffers v3.0.0 Version 3.0.0链接
下拉找到 Assets 标签展开如下
在这里插入图片描述
我是在 Windows 系统上操作,所以我选择下载 protoc-3.0.0-win32.zip 解压后找到 bin 文件夹下面有个 protoc.exe,在环境变量 path 添加 protoc.exe 所在路径,然后打开 cmd 命令行 cd 到 protoc.exe 所在目录,然后输入 protoc --version 能正确显示 protobuf版本就 OK 了
在这里插入图片描述

第二步:使用Protobuf 生成对应语言使用的脚本
创建一个文件夹,在文件夹中新建 xxx.proto 文件,编辑如下 apc.proto

syntax = "proto3";
message ABC{

   string name = 1;
   
   string message_name = 2;

};

第一行 syntax = “proto3”; 指定你正在使用 proto3 语法
message ABC 指定一个类,类名是 ABC

*.proto 也可以相互引用,新建 ddd.proto 编辑如下

syntax = "proto3";
import "apc.proto";
message Npc
{
    string damage = 1;
	
	int32 range = 2;
	
	ABC abc = 3;
};

import “apc.proto”; 意义:在 ddd.proto 中导入 abc.proto
可以在 ddd.proto 中使用 ABC 类了

开始生成对应语言 如 C++、C#、Java
生成 C++,命令行输入

protoc.exe -I=F:\Protobuf\proto --cpp_out=F:\Protobuf\Out F:\Protobuf\proto\apc.proto

在这里插入图片描述
-I=F:\Protobuf\proto 指定 *.proto 文件所在路径:注意:-I 是 横杠 和 大写字母 I
–cpp_out=F:\Protobuf\Out 指定导出的是C++ 文件,导出路径是F:\Protobuf\Out
最后 F:\Protobuf\proto\apc.proto 表示需要导出的是哪一个 .proto 文件
导出结果为一个.h 和一个 .cc 文件 apc.pb.cc apc.pb.h

生成 C# ,命令行输入

protoc.exe -I=F:\Protobuf\proto --csharp_out=F:\Protobuf\Out F:\Protobuf\proto\apc.proto

导出结果为一个 .cs 文件 Apc.cs

生成 Java,命令行输入

protoc.exe -I F:\Protobuf\proto --java_out=F:\Protobuf\Out F:\Protobuf\proto\apc.proto

导出结果为一个 .java 文件 Apc.java

执行三次,最终生成文件如下
在这里插入图片描述
第三步:项目中如何使用生成的 C++、Java、和 C#
我主要使用 C# 语言,需要在 Assets 下找到 C# 对应的 Package : protobuf-csharp-3.0.0.zip 或者 protobuf-csharp-3.0.0.tar.gz,这两个是一样的,我下载的是 protobuf-csharp-3.0.0.zip
在这里插入图片描述
下载 protobuf-csharp-3.0.0.zip 后解压,目录如下
在这里插入图片描述
按目录找到文件 protobuf-3.0.0\csharp\src\Google.Protobuf.sln
在这里插入图片描述
然后用 Visual Studio 打开 Google.Protobuf.sln, 我用的是 VS2017
如下选择 Google.protobuf -> 鼠标右键 -> 生成
在这里插入图片描述
生成成功后会在如下路径:protobuf-3.0.0\csharp\src\Google.Protobuf\bin\Release\net45
三个文件 Google.Protobuf.dll ,Google.Protobuf.pdb , Google.Protobuf.xml
在这里插入图片描述
将这三个文件放入自己的工程,我是在Unity 中使用,需要放在 Plugins 文件夹中
在这里插入图片描述
同时需要将 第二步生成的 C# 文件 Apc.cs 当到Unity中一个脚本目录即可,
C#代码调用如下

    void Start()
    {
        // 实例化对象
        ABC aBC = new ABC();
        aBC.Name = "123";
        aBC.MessageName = "ABC";

        // 将对象序列化为 byte 数组
        byte[] byteData = Serialize(aBC);

        // 反序列化,将 byte 数组 转换回 类对象
        ABC ddd = Deserialize<ABC>(byteData);
        Debug.LogError(ddd.Name + "    " + ddd.MessageName);
    }

    // 序列化:将 protobuf 类对象转换为 byte 数组
    public static byte[] Serialize(IMessage msg)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            CodedOutputStream outPut = new CodedOutputStream(ms);
            outPut.WriteMessage(msg);
            outPut.Flush();
            byte[] byteData = ms.ToArray();
            return byteData;
        }
    }

    // 反序列化:将 byte 数组 转换为 对应的 protobuf 类对象
    public static T Deserialize<T>(byte[] byteData) where T : IMessage, new()
    {
        CodedInputStream stream = new CodedInputStream(byteData);
        T msg = new T();
        stream.ReadMessage(msg);
        return msg;
    }

注意:第三步需要根据自己的语言下载编译对应的 Package 和 使用 .proto 生成对应语言的 脚本

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf(Protocol Buffers)是一种轻量级的数据序列化格式,由Google开发。它可以用于结构化数据的序列化,用于数据通信、持久化和配置文件等场景。下面是使用protobuf的一般步骤: 1. 定义消息类型:使用protobuf语言定义文件(.proto)来描述数据结构和消息类型。你可以定义消息字段的名称、类型和规则等。 2. 编写.proto文件:在.proto文件中定义消息类型、字段和其他相关信息。例如,你可以定义消息的名称、字段的名称和类型、字段的规则(如必填、可选或重复)等。 3. 编译.proto文件:使用protobuf编译器将.proto文件编译为你所选编程语言的源代码。protobuf支持多种编程语言,如C++、Java、Python等。编译后会生成对应语言的源代码文件,其中包含与消息类型相关的类或结构体。 4. 在代码中使用protobuf:在你的代码中引入生成的源代码文件,并使用其中定义的类或结构体。你可以根据需要创建、修改和序列化protobuf消息,以及将其转换为二进制格式或其他格式。 5. 序列化和反序列化:使用protobuf库提供的方法将protobuf消息序列化为二进制格式,或者将二进制数据反序列化为protobuf消息。这样可以实现消息的传输和存储。 总结来说,使用protobuf可以实现跨语言、高效的数据序列化和反序列化,简化了数据传输和存储的过程。通过定义和编译.proto文件,并在代码中使用生成的源代码文件,你可以方便地使用protobuf进行数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值