【Protobuf】Protobuf协议

article/2025/8/30 8:12:39

Protobuf协议

    • 什么是Protobuf
      • 一、编写proto文件
      • 二、生成协议类
      • 三、编码解码
        • 3.1 编码方法
        • 3.2 解码方法

什么是Protobuf

Protobuf是谷歌发布的一套协议格式,它规定了一系列编码和解码方法。

目前,网上已经有不少实现Protobuf编码解码的库,可以直接使用。Protobuf协议的一大特点是编码后的数据量较小,可以节省网络带宽。

使用Protobuf协议的使用流程:

  1. 编写描述文件(即.proto文件)
  2. 安装第三方工具,这个工具可以根据描述文件(即.proto文件)自动生成协议类,协议类里面除了成员属性外,还包含编码解码所需的一些信息。
  3. 调用第三方库函数,将协议对象编码成byte数组。
    请添加图片描述

一、编写proto文件

例:BattleMsg.proto

message MsgMove {optional int32 x = 1;optional int32 y = 2;optional int32 z = 3;
}

二、生成协议类

Protobuf-net是一套开源的第三方库,它不仅提供了将Protobuf描述文件转换成协议类的工具,还实现了协议对象编码解码的方法。不少Unity游戏使用Protobuf-net处理Protobuf协议。

  1. 下载protobuf-net,并且编译
https://github.com/mgravell/protobuf-net
  1. 设置目录
    打开编译好的protobuf-net目录,会看到里面有两个文件夹。proto文件夹是存放proto文件的地方,需要将前面写好的proto文件放进入。cs文件夹为生成出的协议类存放目录。run.bat是一个批处理文件,可以用记事本打开,里面记录需要生成的文件和路径,设置正确的文件和目录才能生成协议。run.bat的内容如下:
protogen.exe -i:proto\BattleMsg.proto -o:cs\BattleMsg.cs
pause
  1. 生成协议类
    将proto文件存放到proto目录下,修改run.bat之后,双击run.bat运行它,程序会生成协议类文件,并存放到cs目录下。

    打开BattleMsg.cs,能够看到如下的协议类。除了成员desc外,协议类还附带了编码解码所需要的一些信息。MsgAttack继承自global::ProtoBuf.IExtensible。使用Protobuf协议,可将global::ProtoBuf.IExtensible当作协议基类。

[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"MsgAttack")]
public partial class MsgAttack : global::ProtoBuf.IExtensible
{public MsgAttack() {}private string _desc = "";[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"desc", DataFormat = global::ProtoBuf.DataFormat.Default)][global::System.ComponentModel.DefaultValue("")]public string desc{get { return _desc; }set { _desc = value; }}private global::ProtoBuf.IExtension extensionObject;global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing){return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing);}
} 
  1. 将协议文件复制到游戏工程

将生成出来的BattleMsg.cs放入游戏工程Script/proto目录下,放入后游戏不能运行,会有一些报错。这是因为生成的文件引用了ProtoBuf.ProtoMember和ProtoBuf.Extensible等类型,它在protobuf-net的库文件中定义,需要把protobuf-net的库文件引入到游戏项目中。

protobuf-net.dll是protobuf-net的库文件,可以在编译好的目录中找到它,将它复制到游戏工程的任一目录中。

三、编码解码

3.1 编码方法

编码方法Encode如下所示。它接收ProtoBuf.IExtensible类型的协议基类,然后调用ProtoBuf.Serializer.Serialize将协议对象转化为字节流。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using proto.BattleMsg;public class testProto : MonoBehaviour {//将protobuf对象序列化为Byte数组public static byte[] Encode(ProtoBuf.IExtensible.msgBase){using (var memory = new System.IO.MemoryStream()){ProtoBuf.Serializer.Serialize(memory, msgBase); return memory.ToArray();}}//Use this for initializationvoid Start() {//Protobuf测试MsgMove msgMove = new MsgMove();msgMove.x = 214;byte[] bs = Encode(msgMove);	//将protobuf对象序列化为Byte数组Debug.Log(System.BitConverter.ToString(bs));}
}

3.2 解码方法

解码方法Decode如下所示。第一个参数protoName代表协议协议名称,第二个参数代表要解码的byte数组,第三和第四参数代表协议体数据所在的起始位置和长度。

程序使用ProtoBuf.Serializer.NonGeneric.Deserialize解码Protobuf数据,并将它转换成基于Protobuf协议基类ProtoBuf.IExtensible的对象返回。

public static ProtoBuf.IExtensible Decode(string protoName, byte[] bytes, int offset, int count)
{using(var memory = new System.IO.MemoryStream(bytes, offset, count)){System.Type t = System.Type.GetType(protoName);return (ProtoBuf.IExtensible)ProtoBuf.Serializer.NonGeneric.Deserialize(t, memory);}
}

http://chatgpt.dhexx.cn/article/LepHSHlJ.shtml

相关文章

protobuf简介

文章目录 一、protobuf的定义二、protobuf的优缺点2.1、优点2.2、缺点 三、protobuf的使用流程3.1、protobuf在Linux下的安装过程3.2、定义proto文件3.3、protoc编译器3.4、调用接口进行序列化、反序列化 四、protobuf的应用场景五、protobuf与json和XML的对比 一、protobuf的定…

java中使用protobuf总结

基本没怎么接触过java编程,别的团队发过来一个用java编写的存储pb的文件,让拆分和解析,硬着头皮做一下,在此将步骤做个记录: 下载安装protobuf https://github.com/protocolbuffers/protobuf/tags?afterv3.6.1.2 编译…

protobuf 详解

protobuf简介 Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化 。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议…

protobuf介绍和语法

目录 前言 语法 标识符 字段 字段类型 proto2和proto3区别 前言 Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。 与XML和JSON格式相比,pr…

Protobuf:一种更小、更快、更高效的协议

C/CLinux服务器开发/后台架构师知识体系 Protobuf介绍 Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反…

win10商店打不开_win10应用商店闪退是咋回事呢

win10虽然具有闪电般的开机速度,并且还新增了很多功能。但比较是全新的操作系统,所以难免会存在一些故障,这里小编就给大家讲讲win10应用商店闪退打不开怎么解决。 方法一 1,首先,打开开始菜单,进入设置&am…

电脑安装Linux闪退,win10系统运行内置Linux系统闪退如何处理

我们在win10系统电脑的使用中,有小伙伴在Linux系统的使用中出现了问题, win10系统运行内置Linux系统闪退的情况出现了,这是什么原因导致的呢,我们在win10系统运行内置Linux系统闪退如何处理,今天小编就来跟大家分享一下…

Java版mc闪退_本文传授win10运行mc闪退的具体操作对策

我们在使用电脑的时候遇到了win10运行mc闪退问题确实比较难受,要是你的电脑技术没有达到一定的水平,可能就不能解决这个win10运行mc闪退的情况。我们应当如何处理这个问题呢?小编先给大伙说说简单的措施:1、确保电脑中安装了 .NET…

(2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案

更新日志 20220609 增加注意事项 注意事项 经过多为网友的反馈,目前这个方法是无法直接解决微软商店打不开的问题。因此,基于我目前的了解(6月9日),如果大家遇到这个问题,真的只能重新 U 盘安装系统了。…

win10内置计算机和天气闪退,win10系统中天气闪退怎么办?Win10天气应用闪退问题解决方法...

win10系统中天气闪退怎么办?最近有部分用户在安装了win10系统后发现自带的天气应用出现闪退的情况,点击天气应用,发现它启动了很久,然后就自动关闭了。之后再点击天气应用就闪退,打不开。而尝试打开别的应用却可以正常…

解决WIN10下应用商店不能用,闪退的情况

解决WIN10下应用商店不能用,闪退的情况 先说下我的情况,也是博主手贱,经常看PC上的某个文件或者程序不顺眼的话就会想办法把它干掉,为此重装过几次系统… 这一次是装了win10的周年更新后,烦人的cortana,onedrive等一些我不想要的APP又回来了,在暴力清理这些APP的时候,需要特殊…

win10java闪退怎么办_Win10应用打不开或闪退怎么办?解决方案在此

可能有一些用户升级Win10之后遇到了应用商店、应用打不开或闪退的问题,此时可尝试通过下面的一些方法来解决。 1、点击任务栏的搜索(Cortana小娜)图标,输入Powershell,在搜索结果中右键单击Powershell,选择“以管理员身份运行”。…

win10的c语言程序闪退,Win10专业版软件打不开闪退怎么办?

现在用到最多的Win10系统是Win10专业版,用户重装Win10专业版系统的目的就是为了解决电脑遇到的问题,然而重装系统后还是会出现许许多多的问题,比如说部分软件打不开了,闪退的问题。如果您也遇到了相同的问题,下面就是小…

win10安装虚拟机闪退_win10应用商店战争机器4闪退,无法运行。

创建日期 2018/01/07 win10应用商店战争机器4闪退,无法运行。 日志名称: System 来源: Microsoft-Windows-DistributedCOM 日期: 2018-01-07 14:05:10 事件 ID: 10001 任务类别: 无 级别: 错误 关键字:…

右击计算机管理打开会闪退,win10应用商店为什么会闪退 win10应用商店出故障怎么修复...

win10系统有个应用商店,在商店里用户可以下载一些软件应用,很多用户反馈win10应用商店老是闪退,重启也没有用,这该怎么办?下面小编为大家科普下win10应用商店闪退的解决方案,希望可以帮助到大家。 win10应用…

win10的c语言程序闪退,win10内置应用出现闪退怎么回事? win10打开应用总闪退的解决方法...

Windows10操作系统新增加很多实用的功能,对大家操作电脑有很大帮助。Win10专业版系统自带有相机功能、地图功能、时钟功能,同时还有一个应用商店功能,有的小伙伴说打开内置应用时出现闪退,究竟是哪里出现问题?针对此问…

win10的c语言程序闪退,win10 1909系统出现应用闪退如何解决

许多用户在升级更新到win10 1909版本系统之后,反映说遇到这样一个问题,就是使用应用的时候会出现闪退的现象,该怎么处理呢,下面给大家带来win10 1909系统出现应用闪退的解决措施。 一、重装应用 将闪退的应用卸载之后重新安装一下…

Window10 应用商店闪退问题

新装win10后打开应用商店,搜索软件直接闪退,查看了网上前人留下的经验发现还是没有解决问题,后来点开了电脑的设置 默认是选中第二项,点击第一项后,应用商店可以使用了 当然选中开发人员模式应用商店也是可以使用的

Win10应用商店、应用打不开或闪退的解决方法

越来越多小伙伴都将系统升级成Win10正式版了,win10功能强大令不少朋友感到非常满意,但也有一些朋友升级后却遇到了一些问题,比如应用商店、应用打不开或闪退的问题,今天快启动小编就跟大家介绍Win10应用商店、应用打不开或闪退的解决方法。 1、点击任务栏的搜索(Cortana小娜…

WIN10应用商店(MicrosoftStore)闪退解决方法!!!

本文参考了: CSDN博主「DreamOneDay」的文章https://blog.csdn.net/zyhj2010/article/details/52232749知乎作者千千之雪的文章https://www.zhihu.com/question/31001796/answer/1099015956 本方法适用于:更改过C:\ProgramFiles\WindowsApps权限的用户 如…