unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本

  • 介绍
    • 优点
    • 缺点
    • Protobuf 为什么比 XML 快得多?
    • Protobuf的Encoding
    • Protobuf封解包的过程
    • 通常编写一个Google Protocol Buffer应用需要以下几步:
  • Protostuff是什么
  • Protobuf工具
  • 总结

介绍

protobuf也就是Google Protocol Buffers是一种轻便、高校的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。
它可用于通信协议、数据存储等领域的语言无关、平台无关扩展的序列化结构数据格式。

优点

  1. 更小、更快—protobuf类似XML,不过它更小、更快。用户可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构,甚至可以在无需重新部署程序的情况下更新数据结构。
  2. 跨平台、跨语言—只需要使用protobuf对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对结构化数据进行轻松读/写。
  3. 向后兼容性好—它有一个非常棒的特性,即“向后”兼容性好,不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样就可以不必担心因为消息结构的改变而造成大规模的代码重构或者迁移。
  4. 语义更清晰——Protobuf的语义更清晰,无须类似XML解析器的内容(因为Protobuf编译器会将.proto文件编译成对应的数据访问类,以对Protobuf数据进行序列化、反序列化操作)。
  5. 简单易学——使用Protobuf无须学习复杂的文档对象模型。 Protobuf的编程模式比较友好、简单易学,同时它拥有良好的文档和示例。对于喜欢简单事物的人而言, Protobuf比其他技术更有吸引力。

缺点

  1. 无法表示复杂概念——Protobuf与XML相比也有不足之处。它功能简单,却无法用来表示复杂的概念。
  2. 通用性不足——XML已经成为多种行业标准的编写工具,而Protobuf只是Google公司内部使用的工具,在通用性上相差很多由于文本并不适合用来描述数据结构,所以Protobuf也不适合用来对基于文本的标记文档(如HTML)建模。
  3. 无法自解释,可读性差——另外,由于XML具有某种程度上的自解释性,它可以被直接读取编辑。而Protobuf以二进制的方式存储,除非有proto定义,否则无法直接读出Protobuf的任何内容。
  4. Protobuf3 之前只支持Java/Python/C++,Protobuf3 以后开始支持 Go/Ruby/PHP 等。

Protobuf 为什么比 XML 快得多?

跟XML相比,Protobuf的主要优点在于性能高。它以高校的二进制方式存储,比XML小3-10倍,快20-100倍。
有两项技术保证了采用Protobuf的程序能获得相对于XML极大的性能提高。
首先,可以考察Protobuf序列化后的信息内容。可以看到Protobuf信息的表示非常紧凑,这意味着消息的体积减小,自然需要更少的资源,如网络上传输的字节数更少、需要的IO更少等,从而提高性能。
其次,需要理解Protobuf封解包的大致过程,从而理解它为什么会比XML快很多。

Protobuf的Encoding

Protobuf序列化后生成的二进制消息非常紧凑,这得益于Protobuf采用了非常巧妙的Encoding方法。在考察消息结构之前,首先介绍一个名为Variant的术语。
Variant是一种紧凑的表示数字的方法、它用一个或者多个字节来表示一个数字,值越小的数字使用越少的字节,这样就能减少用来表示数组的字节数。
消息进过序列化后会成为一个二进制数据流,该流中的数据喂一系列的Key/Value键值对。
采用这种Key/Value结构无需使用分隔符来分割不同的Field。对于可选的Field,如果消息中不存在该Field,那么在最终的MessageBuffer中就没有该Field。
这些特性都有助于减少消息本身的大小。

Protobuf封解包的过程

首先来了解一下XML的封解包过程。
XML需要先从文件中读取字符串,在转换为XML文档对象结构模型,然后再从XML文档对象结构模型中读取指定节点的字符串,最后将这个字符串转换成指定类型的变量。
这个过程非常复杂,其中将XML文件转换为文档对象结构的过程通常需要完成词法、文法分析等大量消耗CPU的复杂计算。
反观Protobuf,只需要简单的将一个二进制序列按照指定的格式读取到C++对应的结构类型中即可,速度非常快。

通常编写一个Google Protocol Buffer应用需要以下几步:

  1. 定义消息格式文件,文件通常以.proto作为后缀名结尾;
  2. 使用Google提供的Protocol Buffer环境进行文件编译,编译成指定的(Jave、Python、C++等)文件;
  3. 使用Protocol Buffer提供的应用接口(API)类库来完成业务程序开发。

Protostuff是什么

相对于json来说,Protocol Buffer门槛更高,因为需要编写.proto文件,再把它编译成目标语言,这样使用起来就很麻烦。
但是现在有了protostuff之后,就不需要依赖.proto文件了,他可以直接对POJO进行序列化和反序列化,使用起来非常简单。

Protobuf工具

这里我是用的是proto2,将.proto的文件打成C#文件

下图是完整的工具,里面还包含了一些其他工具可自己研究,这里我是用的是ProtoGen这个工具
在这里插入图片描述
这个可以在我资源库中搜索protobuf查找文件

打开ProtoGen文件夹如下图所示
在这里插入图片描述
下面放了两个命令文件.BAT文件
如下图文件是将对应的这几个.proto文件生成对应的C#实体文件
在这里插入图片描述
双击运行生成的C#文件如下
在这里插入图片描述
如下图所示的文件是将所有的.proto文件生成对应的C#文件
在这里插入图片描述
生成的C#文件如下图
在这里插入图片描述

总结

如果大家有别的更简便的方法可以私信一下,知识互相分享感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式--适配器模式

实验8:适配器模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解适配器模式的动机,掌握该模式的结构; 2、能够利用适配器模式解决实际问题。 [实验任务]:双向适配器 实现一个双向…

Java学习时间和日期

1 常用类 1.1 Date 表示日期 具体类 设置时间 1.2 Calendar 表示日历 抽象类 设置日历的设定日期 void set(int year,int month,int date); void set(int year,int month, int date, int hour, int minute,int second); void setTime(Date d); int get(int field)&#…

直播的内容多样性

直播,作为一种新兴的媒体形式,已经深入到我们生活的方方面面。其内容多样性是吸引观众的关键因素之一。以下是直播内容多样性的几个主要方面: 1.主题多样性:直播涵盖的主题非常广泛,包括但不限于娱乐、游戏、体育、教育、招聘、新闻、金融、…

VS2020使用MFC开发一个贪吃蛇游戏

背景: 贪吃蛇游戏 按照如下步骤实现:。初始化地图 。通过键盘控制蛇运动方向,注意重新设置运动方向操作。 。制造食物。 。让蛇移动,如果吃掉食物就重新生成一个食物,如果会死亡就break。用蛇的坐标将地图中的空格替换为 #和”将…

Druid源码阅读-DruidStatInterceptor实现

上次我们在druid-spring-boot-starter里面看到有一个DruidSpringAopConfiguration的配置类,然后引入了DruidStatInterceptor这样一个切面逻辑。今天我们就来看一下这个类的实现。 DruidStatInterceptor 这个类的包路径下入com.alibaba.druid.support.spring.stat。…

DC电源模块有哪些注意事项和使用技巧?

BOSHIDA DC电源模块有哪些注意事项和使用技巧? DC电源模块的注意事项和使用技巧包括以下几点: 1. 选择适当的电源模块:根据需要选择合适的电源模块,考虑电压、电流和功率等参数。确保模块能够满足所需的电力要求。 2. 输入电压范…

销售如何挖掘客户?有哪些方法?

在当今竞争激烈的市场环境中,客户资源的挖掘已经成为企业生存和发展的关键。销售人员需要掌握一定的技巧和方法,以有效地发掘潜在客户,提高销售业绩。以下分享一些挖掘客户的常用方法,帮助销售人员更好地开展业务。 一、了解客户需…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议,其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外,还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

Tailwind CSS 原子化开发初体验

Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何模板中的 CSS 类(class)名,然后生成相应的样式代码并写入到一个静态 CSS 文件中。他快速、灵活、可靠,没有运行时负担。再也不用为了取一个 classname 类名…

GAMES101-LAB1

文章目录 一、问题总览二、作业参考2.1 get_projection_matrix()函数2.2 static bool insideTriangle()函数2.3 rasterize_triangle() 三、附件 一、问题总览 在屏幕上画出一个实心三角形,换言之,栅格化一个三角形实现并调用函数rasterize_triangle(con…

【MySQL基础】:超详细MySQL完整安装和配置教程

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. MySQL数据库1.1 版本1.2 下载1.3 安装1.4 客户端连接 🌤️全篇总…

python使用selenium控制浏览器进行爬虫

这里以谷歌浏览器为例,需要安装一下chromedriver,其他浏览器也有相对应的driver,chromedriver下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 然后是打开python环境安装一下依赖pip install selenium&#xf…

json-server实现数据Mock

json-server是一个node包,可以在不到30秒内获得零编码的完整的Mock服务实现步骤:1. 项目内安装json-server ---> npm i -D json-server2. 准备一个json文件 在根目录下(src同级)创建server文件夹,创建data.json文…

【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) 一、BF算法 BF算法,即暴力(Bru…

[java] 转义字符控制台最常用快捷键

转义字符 1)\t:一个制表位,实现对齐的功能 2)\n:换行符 3) \\:一个\ 4)\":一个" 5) \:一个 6) \r:一个回车System.out.println(我亦无他AA\r唯…

Wordpress对接Lsky Pro 兰空图床插件

Wordpress对接Lsky Pro 兰空图床插件 wordpress不想存储图片到本地,访问慢,wordpress图片没有cdn想要使用图床,支持兰空自定义接口 安装教程—在wp后台选择插件zip—然后启用—设置自己图床API接口就ok了,文件全部解密&#xff0c…

pytorch 踩坑

pytorch 踩坑 在pytorch中,如果你定义了没用的组件,同样也会影响你的模型(我也不知道从哪里影响的),看一个例子 def _make_layer(self, block, planes, blocks, stride1, dilateFalse):norm_layer self._norm_layer#downsample Noneprevio…

SQL变更评审常见问题分享

SQL变更评审分享 概述 SQL变更,是我们在开发迭代中不可避免的场景,SQL变更通常是指DDL和DML语句变更,这些sql会影响到数据库表结构或具体数据,变更时如果执行到存在问题的sql脚本,会对实际应用操作难以评估的损失&…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振,可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm,超小型,质地轻。该系列晶振的额定工作范围-40℃~﹢105C内可高稳定性工作,使得信号频率的误差很小。TG5032SMN与其他…

使用 Postman 进行并发请求:实用教程与最佳实践

背景介绍 最近,我们发起了一个在线图书管理系统的项目。我负责的一个关键模块包括三个主要后台接口: 实现对books数据的检索。实施对likes数据的获取。通过collections端点访问数据。 应对高流量的挑战 在设计并部署接口时,我们不可避免地…