1.protobuf 详解
2.在C++中使用Protobuf
3.七爪源码:学习用于序列化结构化数据的源码协议缓冲区 (Protobuf) — 第 1 部分
4.Protobuf入门:在linux下编译使用protobuf
5.ProtoBuf安装及避坑指南
6.å¦ä½å¨eclipseä¸ä½¿ç¨protocolbuf
protobuf 详解
Protobuf,即Protocol Buffers,修改是源码Google公司设计的一种轻量级、高效的修改结构化数据存储格式,用于结构化数据的源码序列化。它被广泛应用于数据存储和远程过程调用(RPC)的修改绝杀买卖公式源码数据交换,支持语言无关、源码平台无关、修改可扩展的源码序列化结构数据格式。目前主要提供了C++、修改Java和Python三种语言的源码API。
Protobuf的修改优势在于其简洁性和高效性,允许开发者定义数据结构,源码并以二进制格式进行序列化和反序列化,修改从而节省了数据传输和存储的源码空间,同时也加快了数据处理的速度。然而,它也有一些劣势,比如学习曲线陡峭,对于初学者来说可能需要一定时间来熟悉其语法和使用方法。
在安装Protobuf时,protoc(Protocol Compiler)是核心组件,它能将.proto文件编译成不同语言的源代码。为了在Windows环境下安装protoc,首先需从GitHub下载protobuf源码,解压后添加bin目录路径到系统环境变量,然后通过命令行运行protoc查看是否成功安装。
对于Go语言的支持,由于protobuf本身并未直接提供Go语言的API,需要额外安装protoc-gen-go插件来生成Go语言的序列化和反序列化代码。在安装完protobuf后,仿cedll源码使用Go1.+版本的命令行安装protoc-gen-go插件。如果需要生成gRPC相关的Go代码,则需要安装protoc-gen-go-grpc插件。
Protobuf的语法涵盖了多种数据类型,包括标量类型、可选类型、重复类型、映射类型以及嵌套的message类型。message成员可以被指定为标量类型,如字符串、整数等,也可以嵌套其他message类型。消息字段可以被标记为可选或重复类型,以适应不同的数据需求。
在.proto文件中定义消息类型时,可以使用默认值来简化序列化过程。默认值在解析数据时如果消息中未包含特定的字段,则将该字段设置为默认值。此外,Protobuf还支持enum(枚举类型)和oneof(互斥字段组)特性,用于定义具有预定义值列表的字段和最多只能设置其中一个字段的字段组。
为了将message与RPC(远程过程调用)结合使用,可以在.proto文件中定义RPC服务接口。通过protobuf编译器protoc,可以生成特定语言的RPC服务代码,包括生成序列化和反序列化的代码以及RPC服务的客户端和服务器代码。
使用protoc编译器将.proto文件编译成目标语言的源代码。编译命令通常会指定输出目录和目标语言,如Go语言。通过设置--go_out参数,荆州麻将源码可以指定生成的Go代码的基本路径。同时,--go_opt参数可以用来为生成的Go代码指定额外的优化选项。--proto_path参数用于设置Protobuf查找.proto文件的路径。
生成gRPC相关的Go代码需要使用protoc-gen-go-grpc插件,并通过--go-grpc_out参数指定输出目录。这将产生用于gRPC服务的客户端和服务器代码。
要使用protobuf,通常会从源代码下载protobuf,然后通过命令行工具protoc进行编译,从而生成特定语言的序列化和反序列化代码,以及RPC服务代码。对于Go语言,除了需要安装protobuf和protoc-gen-go插件外,还需根据需求安装protoc-gen-go-grpc插件来生成gRPC相关的代码。
在C++中使用Protobuf
ProtoBuf的定义和描述:
Protocol Buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它适用于(数据)通信协议、数据存储等。
Protocol Buffers是一种灵活、高效、自动化的结构数据序列化方法,类似于XML,但比XML更小(3 ~ 倍)、更快( ~ 倍)、更简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松地在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,springweb 源码下载而不会破坏由旧数据结构编译的已部署程序。
使用 ProtoBuf教程:
在了解了ProtoBuf的基本概念之后,我们将具体了解如何使用ProtoBuf。
第一步,创建.proto文件,定义数据结构,如下所示:
我们在上例中定义了一个名为Person的消息,语法很简单,message关键字后跟消息名称。之后我们在其中定义了message具有的字段,形式为:
第二步,protoc编译.proto文件生成读写接口:
在.proto文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。ProtoBuf提供相应的接口代码,可以通过protoc这个编译器来生成相应的接口代码,命令如下:
生成的.h,.cpp文件为person.pb.h,person.pb.cpp,且.h的定义与proto文件的内容相关联:
第三步,编写C++业务代码:
c++业务代码对应的CMakeLists.txt为:
参考链接:
七爪源码:学习用于序列化结构化数据的协议缓冲区 (Protobuf) — 第 1 部分
在深入探讨 Protocol Buffers 之前,让我们先了解序列化和反序列化的基本概念。序列化是指将对象转换为线性字节序列以便存储或传输到另一位置的过程。反序列化则是获取存储信息并从中重新创建对象的过程。随着数据的不断增长,序列化和反序列化的数据方法也在不断发展。
CSV(逗号分隔值)是登录html源码一种易于解析和读取的方法,但存在一些缺点,如必须推断数据类型且不保证。当数据包含逗号且列名存在或不存在时,解析变得困难。关系表定义添加了类型信息,数据是完全类型化的,且可以放入表格中。然而,数据必须是平面的,并且不同数据库的数据定义各不相同。JSON(JavaScript 对象表示法)是一种广泛接受的网络格式,数据可以采用任意形式,易于被多数编程语言读取,并且可通过网络轻松共享。然而,JSON 数据没有模式强制,且 JSON 对象大小较大,因为重复的键。
XML(可扩展标记语言)使用类似于 JSON 的元标记,但带有结束标记。由于它们具有结束标记,因此与 JSON 相比,它们的大小要大得多。
Protocol Buffers(或 Protobuf)是一种语言中立、平台中立的可扩展数据序列化协议,不同于 JSON 或 XML。Protobuf 不适合人类使用,因为序列化数据是编译后的字节,难以供人类阅读。它是 Google 用于序列化结构化数据的机制。
Protocol Buffers 的优点包括易于跨编程语言共享数据。在 .proto 文件上运行 Protocol Buffers 编译器时,编译器会以所选语言生成代码。我们只需使用在 .proto 文件中描述的消息类型,包括获取、设置字段值、将消息序列化到输出流以及从输入流解析消息。
为了更高效地设计 .proto 文件,Google 提供了样式指南,应尽量遵守。标准文件格式包括许可证标题(如有适用)、文件概述、语法、包装、导入(排序)、文件选项和其他内容。在 Protocol Buffers 中,字段标签非常重要。最小标签值可以是 1,最大标签值可以是 2²⁹–1 或 ,,。编号从 1 到 的标签使用 1 个字节,而编号从 到 的标签使用 2 个字节。对经常填充的字段使用 1 到 个标签号。
Protocol Buffers 支持多种字段类型,如布尔型、字符串、字节、重复字段、枚举等。在 Protocol Buffers 中,字段名称不重要,它们仅在编程中引用字段时重要。字段标签很重要,最小标签值可以是 1,最大标签值可以是 ,,。编号从 1 到 的标签使用 1 个字节,而编号从 到 的标签使用 2 个字节。对经常填充的字段使用 1 到 个标签号。
枚举允许我们定义事先知道的一个字段可以取的所有值。默认字段值为布尔型的假、数字的 0、字符串的空字符串、字节的空字节、重复的空列表和枚举的第一个值。我们还可以使用其他消息类型作为字段类型。嵌套类型有助于避免命名冲突并加强局部性。在下一篇文章中,我们将探讨 Protocol Buffers 的高级概念。
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安装及避坑指南
在安装ProtoBuf前,确保g++为较新版本,若安装过程中遇到问题,尝试安装其他版本,使用`make uninstall`卸载源码安装的版本。在使用VSCode开发时,可能出现头文件检测不到的问题,这时需要查看编译器是否报错,而非仅依赖插件提示。以下为Linux环境下ProtoBuf的安装步骤。
安装依赖库:`autoconf`、`automake`、`libtool`、`curl`、`make`和`g++`,对于Ubuntu用户,使用`sudo apt-get install`命令安装,对于CentOS用户,使用`sudo yum install`命令安装。访问GitHub下载ProtoBuf的指定版本,如v.,选择`protobuf-all-..zip`进行下载。在Windows环境下下载后,通过xshell的`rz`指令将文件传输至Linux系统。解压zip包后,进入目录。
执行以下命令进行安装:`./configure`,根据需要选择安装方式。若在`configure`中选择第一种方式,直接执行`make`和`make install`即可完成安装。若选择第二种方式,修改了安装目录,还需在`/etc/profile`中添加相关配置信息,最后执行`source /etc/profile`使配置生效。安装完成后,通过`protoc --version`检查版本信息,显示版本号表示安装成功。
进行ProtoBuf测试示例:创建两个文件`test.cc`和`contacts.proto`。`test.cc`文件包含使用ProtoBuf的示例代码,而`contacts.proto`文件定义了相应的数据结构和字段。执行相关语句进行测试,验证ProtoBuf的安装和使用是否正常。
å¦ä½å¨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 ç缺é·ï¼é£å°±æ¯è¿ä¸å¤æçï¼ä¸æ°æ®æ读æ§å¾å·®ã