1.什么是protobuf序列化协议
2.Windows平台C++ 使用VS2015 编译gRPC(总结)
3.使用protobuf实现序列化与反序列化
4.C++_GRPC使用讲解-编译,开发环境搭建
5.Ubuntu16.04中配置p4编程环境(二)
6.网络数据通信—ProtoBuf实现序列化和反序列化
什么是protobuf序列化协议
Protobuf,即Protocol Buffers,是谷歌推出的一种轻量级、高效的结构化数据序列化框架。其核心目的华英会app源码是将复杂的数据结构序列化为字节流,便于在不同语言和平台间传输和存储。Protobuf支持多种编程语言,包括C++、Java、Python、PHP、Go等,通过编译proto文件生成对应的语言版本,实现跨语言数据互解。
在设计使用场景时,Protobuf尤其适用于对消息大小敏感或数据量不大的场景,如APP登录过程中的数据交互。与XML相比,Protobuf在性能和空间效率上具有显著优势,其二进制格式使得文件体积更小,传输速度更快。
在选择序列化协议时,主要考虑的因素包括性能、数据大小、维护复杂度等。Protobuf在性能和空间效率上的表现优异,同时支持动态类型和嵌套类型,使得其在处理复杂数据结构时更加灵活。此外,Protobuf还支持注释、服务定义等特性,devcon工具的源码进一步增强了其应用的多样性和便利性。
要开始使用Protobuf,首先需要定义.proto文件,该文件描述了数据结构的定义,如消息类型、字段规则等。在.proto文件中,可以定义消息类型、字段规则、嵌套类型、服务接口等。通过编译器将.proto文件转换为目标语言的源代码,即可使用生成的类进行序列化和反序列化操作。
使用Protobuf的流程包括定义消息类型、编译生成代码、编写应用逻辑。消息类型定义了结构化数据的规范,生成的代码提供了序列化和反序列化的接口,最终在应用中调用这些接口进行数据的传输和存储。
为了更深入地理解Protobuf的使用方法和最佳实践,推荐观看视频教程和加入相关的学习群组,获取更多实战经验和资源。
如果你想了解更多关于C/C++Linux服务器开发、高级架构师相关的学习资源和社区动态,可以加入以下群组:
即时通讯项目protobuf 通信协议和序列化协议
C/C++Linux服务器开发/高级架构师群:
系统学习公开课地址:[提供链接]
Windows平台C++ 使用VS 编译gRPC(总结)
若要在Windows平台使用VS编译gRPC,首先确保您的开发环境支持最新版本。由于gRPC自3..1版本开始依赖protobuf 3.x,且C++的constexpr特性在VS及更早版本中不被支持,因此推荐使用VS及以上版本进行编译。 对于编译环境的配置,建议您采用以下步骤:下载并安装CMake-gui,html档案展示源码后续步骤将通过其进行操作。
安装Active State Perl,通过命令行验证安装是否成功。
安装Golang,并同样通过命令行进行测试。
尽管Git可能遇到问题,但您可以手动从GitHub下载gRPC代码,版本选择1..0或更高版本。同时,需要下载并解压gRPC的第三方库,如BoringSSL、Protobuf、benchmark等,确保选择正确的版本。 在编译过程中,将gRPC源代码解压至无中文字符的目录,针对Windows 位系统,选择x版本。对于HelloWorld示例,需要在项目配置中添加特定预处理器定义,如_WIN_WINNT和安全警告开关。 确保项目中的编译设置正确匹配,例如调整运行时库版本,以避免LIBCMTD/LIBCMT、MSVCRTD/MSVCRT之间的冲突。最终的编译输出包括bin和lib文件,其中java和go有单独的库。 在使用gRPC时,将helloworld.proto文件复制到适当位置,生成pb和grpc.pb文件,并在客户端和服务器项目中集成。kali内核源码下载通过设置头文件路径、预处理器定义、库目录和附加依赖项,连接所有依赖,完成gRPC的测试和集成。使用protobuf实现序列化与反序列化
protobuf是用来干嘛的?
protobuf是一种用于对结构数据进行序列化的工具,从而实现数据存储和交换。(主要用于网络通信中收发两端进行消息交互。所谓的“结构数据”是指类似于struct结构体的数据,可用于表示一个网络消息。当结构体中存在函数指针类型时,直接对其存储或传输相当于是“浅拷贝”,而对其序列化后则是“深拷贝”。)
序列化:将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化:在其他的计算环境中,将序列化后的数据还原为数据结构和对象。
从“序列化”字面上的理解,似乎使用C语言中的struct结构体就可以实现序列化的功能:将结构数据填充到定义好的结构体中的对应字段即可,接收方再对结构体进行解析。
在单机的不同进程间通信时,使用struct结构体这种方法实现“序列化”和“反序列化”的功能问题不大,但是,在网络编程中,即面向网络中不同主机间的通信时,则不能使用struct结构体,原因在于:
(1)跨语言平台,例如发送方是用C语言编写的程序,接收方是用Java语言编写的程序,不同语言的struct结构体定义方式不同,不能直接解析;
(2)struct结构体存在内存对齐和CPU不兼容的问题。
因此,广告机软件源码在网络编程中,实现“序列化”和“反序列化”功能需要使用通用的组件,如 Json、XML、protobuf 等。
① 性能高效: 与XML相比,protobuf更小(3 ~ 倍)、更快( ~ 倍)、更为简单。
② 语言无关、平台无关: protobuf支持Java、C++、Python等多种语言,支持多个平台。
③ 扩展性、兼容性强: 只需要使用protobuf对结构数据进行一次描述,即可从各种数据流中读取结构数据,更新数据结构时不会破坏原有的程序。
Protobuf与XML、Json的性能对比:
测试万次序列化:
测试万次反序列化:
protobuf 2 中有三种数据类型限定修饰符:
required表示字段必选,optional表示字段可选,repeated表示一个数组类型。
其中, required 和 optional 已在 proto3 弃用了。
protobuf中常用的数据类型:
下载protobuf压缩包后,解压、配置、编译、安装,即可使用protoc命令查看Linux中是否安装成功:
使用protobuf时,需要先根据应用需求编写 .proto 文件定义消息体格式,例如:
其中,syntax关键字表示使用的protobuf的版本,如不指定则默认使用 "proto2";package关键字表示“包”,生成目标语言文件后对应C++中的namespace命名空间,用于防止不同的消息类型间的命名冲突。
然后使用 protobuf编译器(protoc命令)将编写好的 .proto 文件生成目标语言文件(例如目标语言是C++,则会生成 .cc 和 .h 文件),例如:
其中:
$SRC_DIR表示 .proto文件所在的源目录; $DST_DIR表示生成目标语言代码的目标目录; xxx.proto表示要对哪个.proto文件进行解析; --cpp_out表示生成C++代码。
编译完成后,将会在目标目录中生成xxx.pb.h和xxx.pb.cc文件,将其引入到我们的C++工程中即可实现使用protobuf进行序列化:
在C++源文件中包含xxx.pb.h头文件,在g++编译时链接xxx.pb.cc源文件即可:
在protobuf源码中的/examples 目录下有官方提供的protobuf使用示例:addressbook.proto
参考官方示例实现C++使用protobuf进行序列化和反序列化:
addressbook.proto :生成的addressbook.pb.h 文件内容摘要:add_person.cpp :
输出结果:
三种序列化的方法没有本质上的区别,只是序列化后输出的格式不同,可以供不同的应用场景使用。 序列化的API函数均为const成员函数,因为序列化不会改变类对象的内容,而是将序列化的结果保存到函数入参指定的地址中。
.proto文件中的option选项用于配置protobuf编译后生成目标语言文件中的代码量,可设置为SPEED, CODE_SIZE, LITE_RUNTIME 三种。 默认option选项为 SPEED,常用的选项为 LITE_RUNTIME。
三者的区别在于:
① SPEED(默认值): 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。
② CODE_SIZE: 与SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。
③ LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也非常少。 这是以牺牲Protobuf提供的反射功能为代价的。 因此我们在C++中链接Protobuf库时仅需链接libprotobuf-lite,而非protobuf。
SPEED 和 LITE_RUNTIME相比,在于调试级别上,例如 msg.SerializeToString(&str;); 在 SPEED 模式下会利用反射机制打印出详细字段和字段值,但是 LITE_RUNTIME 则仅仅打印字段值组成的字符串。
因此:可以在调试阶段使用 SPEED 模式,而上线以后提升性能使用 LITE_RUNTIME 模式优化。
最直观的区别是使用三种不同的 option 选项时,编译后产生的 .pb.h 中自定义的类所继承的 protobuf类不同:
① protobuf 将消息里的每个字段进行编码后,再利用TLV或者TV的方式进行数据存储; ② protobuf 对于不同类型的数据会使用不同的编码和存储方式; ③ protobuf 的编码和存储方式是其性能优越、数据体积小的原因。
C++_GRPC使用讲解-编译,开发环境搭建
特别强调,grpc对gcc/g++版本有要求,需6.3及以上,低于此版本需升级。首先,确保安装必要的依赖工具。1. 安装依赖工具
如cmake低于3.或gcc/g++低于7.0,请按文档进行更新。cmake推荐安装最新版本(最低3.)。
卸载旧版CMake后,解压下载的cmake包,bin目录包含cmake家族工具。
创建软链接,通常选择/opt或/usr路径。
2. gcc/g++升级
务必升级到6.3以上,版本7.0以上无需重复。安装7.0版本,确认版本显示为7.5。3. 编译grpc
推荐使用cmake编译,对网络有依赖。如果无法访问外部资源,可使用我提供的1..2版本压缩包编译,否则从源码开始下载。下载源码,选择v1..2或其他相应版本。
编译过程中会自动处理protobuf依赖,无需单独安装。
编译完成后,测试helloworld服务和客户端。
4. 辅助工具-scp命令
scp命令用于服务器间文件传输,提供下载和上传文件/目录的功能,但非课程重点。下载:scp username@ip:/path/to/file local/path
上传:scp local/path username@ip:/path/to/destination
下载目录:scp -r username@ip:/path/to/directory local/path
上传目录:scp -r local/path username@ip:/path/to/destination
获取grpc-v1..2源码包,可通过群组获取。Ubuntu.中配置p4编程环境(二)
在Ubuntu . LTS (内核4..0--generic)上搭建p4编程环境,耗时一周,经历了不少挑战。下面分享详细的安装步骤,供参考。
一、安装依赖项与gmock
首先,从源码下载gmock并编译。确保所有单元测试通过,完成后将gmock-1.7.0改名到gmock。
二、安装protobuf
protobuf是关键组件,下载稳定版本,解压后运行脚本。务必确保make check所有模块通过,解决错误后再继续。
三、安装p4c - 编译器核心
从源码下载p4c,如遇到问题可尝试git替代。编译过程中,注意内存不足问题,可能需要创建swap分区。确保所有单元测试通过后,进行安装。
四、bmv2 - 软件交换机环境
下载bmv2源码,安装依赖并升级pip,编译并通过所有单元测试后安装,查看版本确认安装成功。
五、grpc - 通信框架
grpc用于透明通信,安装时确保所有测试通过。
六、安装PI - 控制平面实现
PI的安装相对简单,基本无问题。
七、mininet - 网络仿真器
mininet用于构建虚拟网络拓扑。
八、p4-tutorials - 官方教程与实验
完成所有基础组件后,可以开始学习和实践p4教程。
九、安装完成
最终的P4目录结构如下,工作主要在tutorials目录,其他为工具组件。至此,p4环境已经配置完毕,可以开始你的学习之旅了。
网络数据通信—ProtoBuf实现序列化和反序列化
Protobuf实现序列化和反序列化 本文将介绍如何通过Protobuf实现网络数据通信,具体案例中我们构建一个通讯录应用,包含客户端和服务器端的交互。主要需求包括: 客户端可执行的操作:新增联系人、删除联系人、查询通讯录列表、查询联系人详细信息。 服务器端提供增删查能力,并确保数据持久化。 客户端与服务器间交互数据使用Protobuf。 环境搭建 选择cpp-/yhirose/cpp-... CentOS环境注意事项 在CentOS下,若使用自带的g++版本(如4.8.5,发布于年),在编译项目时可能遇到问题。解决方法是升级gcc/g++至更高版本。 约定双端交互接口新增联系人
删除联系人
查询通讯录列表
查询联系人详细信息
约定双端交互req/resp 设计了多个protobuf文件用于定义请求和响应结构,包括base_response.proto、add_contact_request.proto至find_all_contacts_response.proto等。 相关视频推荐高性能服务器通信协议设计的奥秘:XML、JSON、Protobuf性能对比分析
Protobuf序列化协议工程应用方法和实践分析
qq微信即时通讯技术细节:方案选择
C/C++ Linux服务器架构师学习资料分享群:(包含C/C++、Linux、golang等技术资料)
客户端代码实现main.cc:主程序
ContactException.h:异常类定义
ContactsServer.h:客户端通讯录服务端定义
ContactsServer.cc:客户端通讯录服务实现
服务端代码实现定义通讯录结构(contacts.proto)
main.cc:服务端主程序
ContactException.h:异常类定义
ContactsServer.h:通讯录服务定义
ContactsServer.cc:通讯录服务实现
Utils.h:工具类定义
ContactsMapper.h:数据持久化接口定义
ContactsMapper.cc:数据持久化接口实现
注:在实际应用中,应将通讯录数据存储至数据库,此处为简化流程,以本地文件作为数据存储。