1.Google Protobuf 极速入门使用攻略 (C++版本)
2.Protobuf入门:在linux下编译使用protobuf
3.protobuf 协议原理及实现(C++)
4.Lua动态解析Protocol buffer
5.Protobuf读写Prototxt
6.Protobuf在UE5中的源码简单使用说明
Google Protobuf 极速入门使用攻略 (C++版本)
要学习在C++中使用Google的Protocol Buffer,首先可以参考Git仓库:Teach-Myself-CPP/Protocol-buffer。源码Protocol Buffer作为一种灵活、源码高效且自动化的源码数据序列化解决方案,对于处理数据结构的源码序列化/反序列化问题非常有用。 当你需要在C++中处理数据结构时,源码价格于价值指标源码有多种方法可选。源码然而,源码Protocol Buffer凭借其直观的源码定义方式脱颖而出。它的源码消息格式定义类似于C/C++中的类/结构,支持多种基础类型如int和string,源码以及嵌套类型,源码如PhoneType在PhoneNumber中,源码Person在AddressBook中。源码每个字段可以是源码required(不推荐,影响可移植性)、optional或repeated,分别对应必须存在、可选和可重复的字段值。 安装Protocol Buffer后,通过命令行检查版本更新。然后,使用编译器将消息定义转换为cpp和h文件,导航站hph源码如addressbook.pb.h和addressbook.pb.cc,它们会自动生成访问字段的getter和setter方法。 在实际操作中,有一些通用的函数可以方便地进行消息的序列化和反序列化。例如,可以编写一个程序添加Person到磁盘文件,并反序列化文件中的数据到内存,展示详细信息。 编译和运行程序通常通过Makefile或CMakeLists来完成,但这里我们直接在命令行进行。接下来,尝试执行序列化和反序列化的步骤,完成整个过程。Protobuf入门:在linux下编译使用protobuf
Google Protocol Buffer(简称Protobuf)是一种由Google公司内部开发的数据标准,用于数据序列化。广泛应用于数据存储和远程过程调用(RPC)系统。它具备语言无关性、平台无关性和可扩展性,支持C++、Java和Python等语言。
编译源码包:从GitHub下载Protobuf的源代码,以2.5.0版本为例。游戏流量主源码解压后,执行配置编译命令,创建文件。编译后,文件夹中将包含bin、include和lib目录。
测试工程:将include目录下的文件按目录结构和lib/libprotobuf.a复制到测试目录。定义结构化数据Content,包含id(int)、str(string)和opt(可选成员)。使用protoc程序将Mymessage.proto文件编译成目标语言,生成Mymessage.pb.h和Mymessage.pb.cc文件。
将编译后的Mymessage.pb.o文件与Writer.cpp文件一起编译,生成log文件。Reader从log文件读取,反序列化后获得结构化数据。
Protobuf的优点在于高效、紧凑的二进制数据序列化方式,使其适合数据存储和RPC通信。然而,它缺乏复杂概念表示的能力,与XML相比在通用性上仍有不足。金牛出关指标源码XML自解释性使其在文本描述方面优于Protobuf。
高级应用包括嵌套消息、Import Message和动态编译。嵌套消息如Person包含PhoneNumber,用于Person中的phone域。Import Message允许在包中定义公用消息,通过包引入使用。动态编译允许在运行时处理未知的.proto文件。
编写新编译器:利用Google Protocol Buffer源代码中的protoc编译器,可以开发支持其他语言的编译器。通过实现CodeGenerator派生类,实现代码生成功能。
Protobuf的编码方式使用Varint表示数字,节省空间。Varint用一个或多个字节表示数字,值越小字节越少。消息序列化为紧凑的二进制数据流,无需分隔符,可优化大小。
protobuf 协议原理及实现(C++)
protobuf协议原理及实现(C++)
Protocol Buffers(简称ProtoBuf)是由Google设计的一种高效的数据序列化和通信协议,尤其适合高性能数据传输场景。它与XML、美丽说整站源码JSON相比,具有显著的优势,侧重于数据序列化而非数据结构化的可读性。以下是关于ProtoBuf的一些关键点: 1. ProtoBuf的结构化数据定义使用.proto文件,通过message、import和内嵌message语法实现,但相比XML和JSON,其人类可读性较差,更适用于高效通信和存储。 2. 安装ProtoBuf库可通过GitHub下载,选择适合的版本,例如protobuf-cpp-3..6,然后进行编译安装。验证安装成功的方法是检查protoc版本。 3. 使用ProtoBuf时,首先创建.proto文件定义数据结构,然后通过protoc编译器生成读写接口,包括.h和.cc文件,实现序列化和反序列化操作。例如,测试代码会将Example1对象写入文件。 4. 优化技巧包括重用message对象和使用高效的内存分配器。高级用法包括反射功能,可用于将messages转换为其他格式或执行更复杂的操作,如差异分析或正则表达式匹配。 了解更多关于C++的ProtoBuf教程,可以参考官方文档或在线课程,如ke.qq.com/course/?...Lua动态解析Protocol buffer
Protocol Buffer是Google开源的一种数据存储和RPC格式,因其高效存储和低资源消耗而广泛应用于消息协议处理中。在游戏开发等领域,Protocol Buffer常作为前后端交互消息格式,利用其性能优势简化数据传输。
为了适应手机端的动态更新需求,游戏开发者往往选择使用脚本语言,如Lua,来实现更灵活的协议设计。要将Protocol Buffer的动态解析融入Lua环境,实现协议描述文件修改后无需重新编译C++代码,关键在于设计一个能够动态加载和解析描述文件的解决方案。
动态加载编译协议文件的目标是,在客户端启动后检测描述文件变动,更新至本地后即时加载新文件并使用新描述序列化或反序列化消息数据。这样实现后,客户端无需重新编译,仅需在Lua脚本中新增字段信息即可。
实现这一目标需深入理解Protocol Buffer的动态编译原理。Protocol Buffer通过google::protobuf::compiler::Importer类动态编译未知描述文件,利用google::protobuf::compiler::MultiFileErrorCollector类搜集语法错误,google::protobuf::compiler::SourceTree类缓存加载的描述文件。动态编译时调用Importer对象的import方法即可实现。
获取具体消息类的步骤中,利用Descriptor Pool的FindMessageTypeByName方法从描述文件中获取指定消息的Descriptor。通过Descriptor创建Message实例,最终目标是将Message转化为Lua table,利用Lua table的灵活性高效传递消息数据。
将Protocol Buffer数据结构转化为Lua table,主要依赖反射机制获取Message的所有Field,并通过遍历Lua table的key-value对进行数据传递。对于repeated字段,通过嵌套table形式处理重复的key值。序列化时,同样通过动态创建Message对象并填充Lua table数据,调用SerializeToString方法完成。
在实现中需注意处理required字段的容错和提示信息,确保Lua脚本与C++层数据交互的正确性和稳定性。动态编译Protocol Buffer到Lua脚本的实现,有效提升了游戏开发的灵活性与效率,简化了前后端交互过程,为开发者提供了更为便捷的协议设计与维护手段。
Protobuf读写Prototxt
本文主要介绍如何读取和写入protobuf到bin文件以及读写prototxt相关API。
protobuf将程序运行产生的数据保存到二进制文件中,相较于xml,文件更小,读取速度更快。google提供protobuf工具中包含读写bin文件API。
message类中提供写bin文件API,原型为:std::ostream * output。message类定义数据结构的基类,封装通用接口。
可以通过google官方API文档访问详细信息:/protocol-buffers/docs/referenc/cpp/google.protobuf.message#Message.SerializeToOstream.details
除了按照输出流写bin文件,还支持按照文件描述符操作,其他API包括。
示例一:在Family数据结构中添加两个成员,并将结果写入test.db文件。生成的test.db文件为加密压缩的二进制数据。
示例二:从生成的bin文件读取数据。bin文件不仅支持写入,还支持读取,能完全恢复数据。
示例三:使用写Prototxt文件API将添加的两个成员写入到prototxt文件。生成的文件格式类似Python元组。
prototxt文件用于caffe中保存网络拓扑结构及参数,格式为txt形式,便于可视化修改。prototxt文件读写API在text_format.h文件中。
示例四:使用读Prototxt文件API从生成的prototxt文件读取数据。成功将数据读取到内存中。
Protobuf在UE5中的简单使用说明
Protocol Buffer(简称 Protobuf)是 Google 提供的一种数据存储格式,用于结构化数据的高效序列化。它支持跨多种编程语言通信,通过单一标准协议定义数据格式,自动生成语言特定的包。
步骤1:创建proto文件。以登录消息`login.proto`为例,文件中定义了消息结构和消息ID。
步骤2:生成对应C++文件。通过批处理脚本在`client\Plugins\BLProtobuf\Source\BLProtobuf\protoc_tools`目录下双击,即可自动生成并拷贝到`client\Source\ProjectMeta\Proto`目录。
步骤3:注册包反射。需要在头文件中提供消息ID和消息类名,之后在回调函数中调用RegisterPackage,完成包注册。
步骤4:实现回调函数。确保RegisterPackage调用在回调函数之后,简单地将其加入到每个回调函数文件的末尾。
开发建议:设计子系统,如登录子系统,包含发起登录、登录回调接口。注册等接口可在子系统中扩展。
具体C++实现代码如下,其中省略了详细代码示例,建议根据实际情况调整并添加到对应文件中。
Protobufåè®®å®ç°åç
protobuf æ¯Googleå¼æºçä¸æ¬¾æ¯æ跨平å°ãè¯è¨ä¸ç«çç»æåæ°æ®æè¿°åé«æ§è½åºåååè®®ï¼æ¤åè®®å®å ¨åºäºäºè¿å¶ï¼æ以æ§è½è¦è¿è¿é«äºJSON/XMLãç±äºåºè²çä¼ è¾æ§è½æ以常è§äºå¾®æå¡ä¹é´çé讯ï¼å ¶ä¸æ为èåçæ¯Googleå¼æºç gRPC æ¡æ¶ãé£ä¹protobufæ¯å¦ä½å®ç°é«æ§è½çï¼åæ¯å¦ä½å®ç°æ°æ®çç¼ç å解ç çå¢ï¼
åºäºbitsçæ°æ®åå¨æ¹å¼(Base Varints)
Varint æ¯ä¸ç§ç´§åç表示æ°åçæ¹æ³ãå®ç¨ä¸ä¸ªæå¤ä¸ªåèæ¥è¡¨ç¤ºä¸ä¸ªæ°åï¼å¼è¶å°çæ°å使ç¨è¶å°çåèæ°ãè¿è½åå°ç¨æ¥è¡¨ç¤ºæ°åçåèæ°ã
æ¯å¦å¯¹äº int ç±»åçæ°åï¼ä¸è¬éè¦ 4 个 byte æ¥è¡¨ç¤ºãä½æ¯éç¨ Varintï¼å¯¹äºå¾å°ç int ç±»åçæ°åï¼åå¯ä»¥ç¨ 1 个 byte æ¥è¡¨ç¤ºãå½ç¶å¡äºé½æ好çä¹æä¸å¥½çä¸é¢ï¼éç¨ Varint 表示æ³ï¼å¤§çæ°ååéè¦ 5 个 byte æ¥è¡¨ç¤ºãä»ç»è®¡çè§åº¦æ¥è¯´ï¼ä¸è¬ä¸ä¼ææçæ¶æ¯ä¸çæ°åé½æ¯å¤§æ°ï¼å æ¤å¤§å¤æ°æ åµä¸ï¼éç¨ Varint åï¼å¯ä»¥ç¨æ´å°çåèæ°æ¥è¡¨ç¤ºæ°åä¿¡æ¯
Varint ä¸çæ¯ä¸ª byte çæé«ä½ bit æç¹æ®çå«ä¹ï¼å¦æ该ä½ä¸º 1ï¼è¡¨ç¤ºåç»ç byte ä¹æ¯è¯¥æ°åçä¸é¨åï¼å¦æ该ä½ä¸º 0ï¼åç»æãå ¶ä»ç 7 个 bit é½ç¨æ¥è¡¨ç¤ºæ°åãå æ¤å°äº çæ°åé½å¯ä»¥ç¨ä¸ä¸ª byte 表示ãå¤§äº çæ°åï¼æ¯å¦ ï¼ä¼ç¨ä¸¤ä¸ªåèæ¥è¡¨ç¤ºï¼ ã
å¦å¤å¦æä»æ°æ®å¤§å°è§åº¦æ¥çï¼è¿ç§è¡¨ç¤ºæ¹å¼æ¯å®ç°çæ°æ®å¤äºä¸ä¸ªbit, æä»¥å ¶å®é ä¼ è¾å¤§å°å°±å¤%ï¼1/7 = 0.ï¼ã
æ°å1表示æ¹å¼ï¼
对äºå°çæ°æ®æ¯è¾å¥½ç解ï¼æ£å¸¸æ åµä¸1çäºè¿å¶æ¯ ,使ç¨bits表示çè¯ï¼é¦ä½ç»ææ è¯ä½ä¹æ¯0ï¼æ以两è ç»ææ¯ä¸æ ·ç 0ã
æ°å 表示æ¹å¼ï¼
<figcaption></figcaption>
è¿ä¸ªæç¹ä¸å¤ªå¥½ç解äºï¼è¿æ¯å 为åæ¬ç¨ä¸ä¸ªåè(8bit)å°±å¯ä»¥è¡¨ç¤ºï¼ä½ç±äºä½¿ç¨bits表示æ¹æ³ï¼éè¦å¯¹æ¯ä¸ªåèçæé«ä½æ·»å ä¸ä¸ªç»ææ è¯ä½æ¥è¡¨ç¤ºï¼æ以ä¸ä¸ªåèå·²ç»ä¸å¤ç¨äºï¼éè¦å ç¨ä¸¤ä¸ªåèæ¥è¡¨ç¤ºï¼å ¶ä¸ä¸¤ä¸ªåèæé«ä½é½æ¯ç»ææ è¯ä½ã
å¦ææ£åæ¨ç®çè¯ï¼æ们ç¥éæ°åçäºè¿å¶å¼ 1 ï¼ç¨ä¸¤ä¸ªåè表示å®æ´å¼å为
# äºè¿å¶
_ _ # äºè¿å¶æ¯ä¸ªåèçæé«ä½å左移å¨ä¸ä¸ªä½ç½®ï¼æ¾å ¥ç»ææ è¯ä½
01# 转æ¢ä¸ºbitsæ¹å¼,1:ç»æï¼0:æªç»æ
10# 转æ¢ä¸º å°ç«¯åèåº , ä½åèå¨åï¼é«åèå¨å
注æè¿éæ¯å æ·»å ç»ææ è¯ç¬¦ï¼ç¶åå转为å°ç«¯åèåºã
æ¶æ¯ç»è¿åºåååä¼æ为ä¸ä¸ªäºè¿å¶æ°æ®æµï¼è¯¥æµä¸çæ°æ®ä¸ºä¸ç³»åç Key-Value 对ãå¦ä¸å¾æ示ï¼
éç¨è¿ç§ Key-Pair ç»ææ é使ç¨åé符æ¥åå²ä¸åç Fieldã对äºå¯éç Fieldï¼å¦ææ¶æ¯ä¸ä¸åå¨è¯¥ fieldï¼é£ä¹å¨æç»ç Message Buffer ä¸å°±æ²¡æ该 fieldï¼è¿äºç¹æ§é½æå©äºè约æ¶æ¯æ¬èº«ç大å°ã
Key ç¨æ¥æ è¯å ·ä½ç fieldï¼å¨è§£å çæ¶åï¼å®¢æ·ç«¯å建ä¸ä¸ªç»æ对象ï¼Protocol Buffer ä»æ°æ®æµä¸è¯»å并ååºååæ°æ®ï¼å¹¶æ ¹æ® Key å°±å¯ä»¥ç¥éç¸åºç Value åºè¯¥å¯¹åºäºç»æä½ä¸çåªä¸ä¸ª fieldã
èKeyä¹æ¯ç±ä»¥ä¸ä¸¤é¨åç»æ
Key çå®ä¹å¦ä¸ï¼
| 1 | (field_number << 3) | wire_type |
å¯ä»¥çå° Key ç±ä¸¤é¨åç»æã第ä¸é¨åæ¯ field_numberã第äºé¨å为 wire_typeã表示 Value çä¼ è¾ç±»åã
ä¸ä¸ªåèçä½3ä½è¡¨ç¤ºæ°æ®ç±»åï¼å ¶å®ä½å表示å段åºå·ã
Wire Type å¯è½çç±»åå¦ä¸è¡¨æ示ï¼
å¨æ们çä¾åå½ä¸ï¼field id æéç¨çæ°æ®ç±»å为 intï¼å æ¤å¯¹åºç wire type 为 0ãç»å¿ç读è æ许ä¼çå°å¨ Type 0 æè½è¡¨ç¤ºçæ°æ®ç±»åä¸æ int å sint è¿ä¸¤ä¸ªé常类似çæ°æ®ç±»åãGoogle Protocol Buffer åºå«å®ä»¬ç主è¦æå¾ä¹æ¯ä¸ºäºåå° encoding åçåèæ°ã
æ¯ä¸ªæ°æ®å¤´åæ ·éç¨bitsæ¹å¼ï¼ä¸è¬1个åè就足å¤äº,
æ¬ä¾ä¸å段a çåºå·æ¯1
å¦ä¸åå»ºäº Test1 çç»æ并ä¸æ a çå¼è®¾ä¸º 2ï¼åºåååçäºè¿å¶æ°æ®ä¸º
00
Key é¨åæ¯
value é¨åæ¯ , å ¶ä¸åèæé«ä½æ¯ç»ææ è¯ä½ï¼å³è¿å¶ç2ï¼æ们å¨è½¬æ¢çæ¶åç»ä¸å°ç¬¦å·ä½è½¬ä¸º0å³å¯ã
åè®®è§å®æ°æ®å¤´çä½3ä½è¡¨ç¤ºwire_typeï¼ å ¶å®å段表示å段åºå·field_numberï¼å æ¤
_ # å»æç»ææ è¯ç¬¦ä½
_ # 表示æ°æ®ç±»åï¼ è¿éæ¯Varint
_ # è¿åä½è¡¨ç¤ºå段åºå·
/linux/l-cn-gpb/
åæï¼ /archives/