1.Google Protobuf 极速入门使用攻略 (C++版本)
2.Lua动态解析Protocol buffer
3.å¦ä½å¨eclipseä¸ä½¿ç¨protocolbuf
4.Protocol Buffer详解(一)
5.protobuf 一种更小、更快、更高效的协议
6.Protobufåè®®å®ç°åç
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文件,如addressbook.pb.h和addressbook.pb.cc,它们会自动生成访问字段的getter和setter方法。 在实际操作中,有一些通用的函数可以方便地进行消息的序列化和反序列化。例如,可以编写一个程序添加Person到磁盘文件,并反序列化文件中的数据到内存,展示详细信息。 编译和运行程序通常通过Makefile或CMakeLists来完成,pdf翻页阅读源码但这里我们直接在命令行进行。接下来,尝试执行序列化和反序列化的步骤,完成整个过程。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脚本的实现,有效提升了游戏开发的灵活性与效率,简化了前后端交互过程,为开发者提供了更为便捷的协议设计与维护手段。
å¦ä½å¨eclipseä¸ä½¿ç¨protocolbuf
Protocbuf å°±æ¯Protocol buffersï¼mxlä¸æ ·å¨åºååæ°æ®ç»ææ¶å¾çµæ´»ãé«æåæºè½ï¼ä½æ¯å®çä¼å¿å¨äºå®ä¹æ件æ´å°ï¼è¯»åé度æ´å¿«ï¼ä½¿ç¨æ´å ç®åã
使ç¨æ¥éª¤ï¼
1 ä¸è½½ç¼è¯å¨åprotocolbuffçjarå ã
2 æä¸è½½å¥½çjarå¯¼å ¥å°eclipseã
3 解åç¼è¯å¨å缩å ï¼å¾å°ä¸ä¸ªprotoc.exeã
4å¨eclipseä¸æ°å»ºä¸ä¸ªå·¥ç¨ï¼ååæ¯å¦å«åprotocolbufferï¼å¨è¯¥å·¥ç¨ç®å½ä¸ï¼æ°å»ºä¸ä¸ªprobuf(ååéæå)æ件夹ï¼ç¨æ¥è£ ï¼.protoï¼æ件çãåæ¶æåæ解åå¾å°çprotoc.exe移å¨å°è¯¥å·¥ç¨ç®å½ä¸é¢ï¼å¹¶å¨pathè·¯å¾ï¼é 置该.exeçç¯å¢åéã
5 Googleå®ç½ï¼æ个AddressBookProtosçä¾åï¼ä¹å°±æ¯åªä¸ª.protoæ件ï¼å»åå°ä¸å¨å¤å¶ä¸æ¥ï¼ç¶åï¼æ¾å°åææ°å»ºçå·¥ç¨ä¸probufçæ件夹ä¸ï¼æ³¨ææ件æ©å±åå¿ é¡»æ¯.protoã
6 ç¨protoc.exeç¼è¯è¿ä¸ªaddressbook.protoæ件ï¼æå¼å½ä»¤è¡ï¼è¿å ¥æ建工ç¨ç®å½ï¼æ§è¡å¦ä¸å½ä»¤ protoc âI=probuf/ --java_out=src probuf/addressbook.proto,(å¦æ建çæ件ååè¿ä¸ªä¸æ ·ï¼ç´æ¥åå°ä¸å¨ï¼å¤å¶ç²è´´ï¼æ§è¡å³å¯)ï¼æ§è¡å®æ¯å³å¯å¾å°javaæ件ï¼è·¯å¾æ¯src\com\example\tutorial\AddressBookProtos.javaã
7å¨eclipseä¸çæ°å»ºå·¥ç¨srcä¸æ¯å¦åå¨\com\example\tutorial\ AddressBookProtos.javaï¼eclipseä¸æ²¡æå¯¼å ¥æåï¼éè¦æä»å¯¼å ¥eclipseä¸ï¼ææ¯ç´æ¥æsrcä¸æ¤å ç´æ¥åªåï¼ç¶åæ¾å°æ¡é¢ï¼ç¶åç´æ¥å¨eclipseä¸srcä¸ç²è´´å°±å¯ä»¥äºã
8ç¼åæµè¯javaæ件ãGoogleåæ ·æç»åºä¾åï¼å ¶javaæºç å¨åææ¾addressbook.protoæ件夹ä¸ï¼æ个LisPeople.javaåä¸ä¸ªAddPerson.java,ç´æ¥å¤å¶ç²è´´è¿å ¥ä½ çeclipseä¸å³å¯ä½¿ç¨ã
9ç°å¨javaæºç é½è¿å ¥äºeclipseä¸ï¼å¹¶ä¸æ ä»»ä½é误ãé¦å æ§è¡æ·»å 人ç©ä¿¡æ¯ï¼è¿è¡æ¶å´åºéäºï¼æ¾ç¤ºï¼Usage: AddPersonADDRESS_BOOK_FILEï¼è¿æ¯å 为ï¼ä½ ç¨çeclipseæ§è¡çï¼è并éç¨å½ä»¤æ¥æ§è¡çï¼mainæ¹æ³ä¸çï¼String[] args为空ï¼åºè¯¥æ³¨éæmainæ¹æ³ä¸ç´§è·ççifæ£æ¥ï¼å¹¶å°ææçargs[0]ç¨ä¸ä¸ªstring代æ¿ï¼æ¯å¦âperson.txtâ,å次æ§è¡ï¼å°±è½æ·»å äºã
æ©å±ï¼
ProtocolBuf ç缺é·ï¼é£å°±æ¯è¿ä¸å¤æçï¼ä¸æ°æ®æ读æ§å¾å·®ã
Protocol Buffer详解(一)
Protocol Buffer是一种支持多平台、多语言、可扩展的数据序列化机制,与XML相比,protobuf体积更小、速度更快、使用更简单,支持自定义数据结构。通过protobu编译器,可以生成特定语言的源代码,如C++、Java、Python,protoBuf对主流编程语言都提供了支持,使得序列化和反序列化变得非常方便。
一、Message定义
这里给出一个简单的例子,是一个搜索请求的message格式。
上述例子中fields的种类都是数值型的(string和int),当然也可以指定更加复杂的jar无源码调试fields,比如枚举类型enum,或者是嵌套的message类型。
1、分配field编号
上述例子中每个field都被分配了一个编号,这个编号是该field的唯一标识。需要注意的是,标识1-在编码时只占用一个字节,-占用两个字节,因此为了进一步优化程序,对于经常出现的element,建议使用1-作为其唯一标识;对于不经常使用的element,建议使用-。编号的范围是1-2^(-是系统预留的,不要使用)。
2、field类型
message中的field类型包含以下两种(proto3):
(1)singular
(2)repeated:该类型的field可以在message中重复使用(类似于数组),它们的顺序会被保存,通过索引进行检索,数值类型的repeated默认使用packed编码方式。
3、多message结构
在一个proto文件中可以定义多个protobuf。
4、reserved field类型
在开发过程中可能会涉及到对proto文件中message各个fields的修改,可能是更新、删除某个field及其表示,这样可能会导致调用的服务失败。其中一个防止这种问题的方式是,确保你要删除的field的标识(或是名字)是reserved,具体protobuf的编译器会决定未来这个field表示能否被使用。
5、编译结果
对于C++开发者来说,使用protoc编译一个proto文件之后,会生成pb.h和pb.cc两个文件。dw做网站源码
二、数值类型
具体proto类型对应生成类中的类型可以参考官方文档。
三、默认值
对于string和byte类型,默认值为空;对于bool类型,默认值是false;对于数值类型,默认值是0;对于枚举类型,默认值是第一个枚举值,默认为0;对于message类型,默认值由编程语言决定;对于repeated field,默认值为空。
四、枚举类型
当采用枚举类型的之后,枚举中的值都是预先定义好的,对于上述例子,我们可以再额外增加一个枚举类型corpus,具体如下。
通常枚举类型的第一个值初始化为0,而且在message中使用枚举类型,必须要给定一个为0的值,而且这个为0的值应该为第一个元素。
也可以给不同的元素以相同的alias,但是需要指定option allow_alias = true;具体如下。
除此之外枚举类型不仅可以定义在message内部,也可以定义在message外部,而且在不同message中可以重用enum。
在更改枚举类型field时,为保证系统运行正常,同样可以指定reserved数字标识和命名。
五、使用其他message类型
1、同文件引用
具体如下:
2、不同文件引用
引用其他proto文件中定义好的message类型,具体如下。
有时我们会对引用的proto文件进行更改,比如将其内容移动到另外一个地方,这样我们就需要对调用方import路径进行更改,当调用方非常多的时候,这种方法是非常低效的,protobuf提供一种机制,我们可以在原有位置提供一个新位置proto文件的“副本”,通过使用import public表示来实现,具体可以参考如下例子。
这时编译器就会在某些固定目录下查询import的proto文件(具体在命令行编译的时候,由-I/—proto_path指定),如果上述路径找不到,编译器会在调用路径进行查找。通常将—proto_path设置为项目的根目录,然后import的时候使用完整的路径名。
3、使用proto2中的message类型
proto2中的枚举类型无法直接使用。
六、嵌套类型
具体如下。
在parent message之外调用嵌套的message可以用如下方式:SearchResponse.Result,嵌套结构可以更加复杂,具体如下:
七、更新message类型
当现有的message已经无法满足现有业务需要,你需要更新你的message类型以支持更复杂的业务,这就涉及到向后兼容的问题了,为保证已有服务不受影响,需要遵守以下的一些规定:
1、不要更改已经存在的fields的数字标识
2、如果添加新的field,利用旧代码序列化得到的message可以使用新的代码进行解析,你需要记住各个元素的默认值。新代码创建的field同样可以由旧代码进行加解析
3、field可以被删除,但是需要保证其对应的数字标识不再被使用,你可以通过加前缀的方式来重新使用这个field name,或者指定数字标识为reserved来避免这种情况
4、int、int、uint、uint、bool这些类型都是互相兼容的,并不会影响前向、后向兼容性
5、sint和sint之间是互相兼容的,但是和其他数字类型是不兼容的
6、string和bytes是互相兼容的,只要使用的是UTF-8编码
7、如果byte包含message的编码版本,则嵌套的message和bytes兼容
8、flexed兼容sfixed,fixed,sfixed
9、enum兼容 int, uint, int, and uint。对于这个值在转化时,不同语言的客户端处理方式会有所不同
感兴趣的小伙伴可以关注公众号:独立团丶
protobuf 一种更小、更快、更高效的协议
Protocol Buffers,简称protobuf,是由Google开发的一种数据格式,类似于XML,能够将结构化数据序列化,适用于数据存储、通信协议等领域。它不依赖于语言和平台,且可扩展性极强。
protobuf仓库地址为:github.com/protocolbuff...
protobuf支持多种编程语言,例如C++、Java、Python等。然而,它并不支持C语言,因此出现了第三方的protobuf-c。
protobuf-c仓库地址为:github.com/protobuf-c/p...
要使用基于C语言的protobuf,首先需要安装protobuf与protobuf-c。
在Ubuntu下安装protobuf的方法如下:
首先,需要安装依赖工具,然后依次输入以下命令下载、编译、安装protobuf:
其中,执行./autogen.sh命令是为了生成configure配置脚本,执行configure可生成Makefile文件,执行make进行编译,执行sudo make install命令进行安装,执行sudo ldconfig命令让动态链接库为系统所共享。
同样,protobuf-c也需要依赖于pkg-config,输入以下命令进行安装:
然后输入以下命令下载、编译、安装protobuf-c:
按照以上方式安装,protobuf与protobuf-c默认安装在/usr/local路径下。
在安装过程中可能会遇到各种错误,遇到错误时,仔细查看错误描述以及本篇文章的安装步骤,看是否遗漏了哪一步。
protobuf的核心是一个.proto文件,我们自定义一个.proto文件来创建我们的协议数据,然后使用protoc-c工具编译生成C代码,生成两个文件:一个头文件、一个源文件。
例如,我们创建一个student.proto文件:
其中,syntax为语法版本,有proto2、proto3两个版本,我们使用proto2。与C语言类似,.proto也规定了一些数据格式,如proto2的数据类型有:double、float、int、uint、string等。
本例中,message为关键字,修饰的Student会对应生成我们C中的Student结构体。其中required为前缀修饰,表明该字段是必填字段。还有其他两个修饰关键字:
使用protoc-c工具编译student.proto文件的命令:
此时编译会生成student.pb-c.c、student.pb-c.h两个文件。我们看看student.pb-c.h里面有什么:
可以看到,student.pb-c.h里生成了一个协议数据结构体与操作该结构体的一些接口,包括组包与解包接口,对应的student.pb-c.c里就是这些接口对应的实现。
编写我们的student.c测试demo:
demo很简单,组包就是构造一个协议数据结构体,调用pack组包接口往buffer中扔数据;解包正好是反过来,从buffer中拿数据放到结构体里。
编译命令:
加上-lprotobuf-c参数链接动态链接库protobuf-c.so,因为前面安装操作的时候有使用ldconfig命令了,所以这里不需要指定动态库路径,否则需要指定。
编译运行:
如果运行时报错:找不到动态库,可输入如下命令导出动态库:
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/
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++实现代码如下,其中省略了详细代码示例,建议根据实际情况调整并添加到对应文件中。