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

news2024/11/15 18:17:14

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#文件如下图
在这里插入图片描述

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三章Maven依赖的特性-基础篇

文章目录 Maven依赖核心配置文件pom.xml依赖的范围概念compile 和 test 对比compile 和 provided 对比结论 测试验证 compile 范围对 main 目录有效验证test范围对main目录无效验证test和provided范围不参与服务器部署验证provided范围对测试程序有效 依赖的传递概念传递的原则…

计算机体系结构实验三-缓存一致性

最近在看CMU15-418,LECTURE10-11就是讲两个缓存一致性协议,刚好这部分内容在实验中学习过,在实验中监听式协议提到的是MSI协议(modified,shared,invalid),lecture中还讲了优化的版本MESI(应该是实际使用的协…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二:人脸表情识别-VGG16实现 本文为🔗小白入门Pytorch内部限免文章 参考本文所写记录性文章,请在文章开头注明以下内容,复制粘贴即可 🍨 本文为🔗小白入门Pytorch中的学习记录博客🍦 参…

CSMM软件能力成熟度评估

CSMM认证,又称为“软件能力成熟度评估”,也有地方称为“CSMM软件能力成熟度模型评估国家标准认证”,也被民间喊作“中国版CMMI认证”。该标准于2021年6月8日发布,是我国自主标准,适合中国国情以及中国软件企业的特点。…

2023腾讯云服务器价格表(轻量/CVM/免费/GPU)

腾讯云服务器租用价格表,轻量应用服务器、云服务器CVM、免费云服务器申请和GPU云服务器配置报价,轻量2核2G4M价格108元一年、2核4G6M带宽159元一年、4核8G10M优惠价425元一年、8核16G14M优惠价1396元一年、16核32G20M价格2775.99元一年,云服务…

Cesium冷知识:API中显示私有方法

在Cesium.js源码中, 某些类或方法的注释中含有private这个“私有”标识 会导致不会在API文档中显示 (这是jsdoc的规范) 解决方法: Ceisum.js 1.110.0版本的解决方案: 在gulpfile.js中的buildDocs方法中&#xff0…

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到,把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程:https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图

ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析

前一篇文章已经介绍过导入要素范围与地图服务的叠加分析,相当于单要素与多要素之间的分析,这篇文章介绍地图服务与地图服务之间的叠加分析,即是多要素有多要素之间的相交分析,功能基本类似。 一、结果预览 二、需求简介 以下是一些常见的业务场景: (1)空间规划和土地…

淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询

一、接口参数说明:提取淘宝商品详情页各项数据,包含skuid、价格、收藏数、加购数、月销售量、主图、标题、详情页图片等页面上可以看奥的数据都可以拿到。 点击获取key和secret 二、使用场景 1、商品销售情况分析,根据销量调整活动方案&am…

【linux系统】如何在服务器上安装Anaconda

文章目录 1. 安装Anconda1.1. 下载Anaconda安装包1.2. 安装Anaconda1.2.1. 点击回车(Enter)1.2.2. 添加环境变量1.2.3. 激活环境变量 1.3. 检查是否安装成功 2. Anaconda安装pytorch2.1. 创建虚拟环境2.2. 激活(进入)虚拟环境2.3. 安装pytorch 1. 安装An…

51单片机实现换能器超声波测水深

一,超声波换能器定义: 定义1:可把电能、机械能或声能从一种形式转换为另一种形式的能的装置。 所属学科:测绘学下的测绘仪器。 定义2:能量转换的器件。在水声领域中常把声呐换能器、水声换能器、电声换能器统称换能器。…

电脑出现vcomp140.dll错误,五种解决办法分享

电脑出现由于找不到 vcomp140.dll 无法继续执行代码的问题,通常是因为系统缺失了 Microsoft Visual C 2015 Redistributable 导致的。为了解决这个问题,您可以尝试以下 5 个解决方案: 方案1:使用dll修复工具:下载vcomp…

【图灵诸葛】jvm笔记

2023年10月23日14:04:44 jvm 1.jdk体系结构图回顾(Av333129672,P1) jdk jre 底层是hotspot jvm 2.java虚拟机内部组成(Av333129672,P2) 堆 方法区 执行引擎 类加载 本地方法栈 线程栈(虚拟机栈) 3.java虚拟机栈讲解(Av333129672,P3) 程序计数器&#xf…

Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试,unittest模块特性、大致流程、源码及实战例子这几个模块,有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…

二叉树的各类实现判断二叉树的递归套路

如何判断一颗二叉树是否是搜索二叉树? 搜索二叉树 每个子树头节点的左孩子比它小,右孩子比它大 经典的搜索二叉树没有重复的数 判断 将二叉树按照中序遍历,判断是否为升序 1、先将整棵树中序遍历再判断是否升序 //中序遍历public stat…

如何获取ABAP的程序事件顺序的调用堆栈

难道有激情总结下之前做过的事情,话不多说直接上图 重点在于此函数 CALL FUNCTION SYSTEM_CALLSTACK IMPORTING ET_CALLSTACK L_CSTACK_TAB. " internal table

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 梳理 AD9371 时钟,理解采样率和各个时钟之间的关系 …

【WCA-KELM预测】基于水循环算法优化核极限学习机回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

详解Windows系统下面如何查看CUDA、cuDNN、Python和各个软件包的版本

文章目录 简介查看CUDA版本查看cuDNN版本查看Python版本查看Python环境中已安装软件包的版本参考 简介 这个题目网络上有很多的讲解,但是查看CUDA、cuDNN版本和查看Python与自身各个软件包是分开的,且cuDNN版本的查看方式似乎已经过时【截止2023-10-23】…

测试面试必备:HTTP请求和响应详解!

一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同…