1.什么是protobuf序列化协议
2.Windows平台C++ 使用VS2015 编译gRPC(总结)
3.使用protobuf实现序列化与反序列化
4.C++_GRPC使用讲解-编译,开发环境搭建
5.Ubuntu16.04中配置p4编程环境(二)
6.网络数据通信—ProtoBuf实现序列化和反序列化
什么是protobuf序列化协议
Protobuf,即Protocol Buffers,是谷歌推出的一种轻量级、高效的结构化数据序列化框架。其核心目的直播带游戏二开源码是将复杂的数据结构序列化为字节流,便于在不同语言和平台间传输和存储。Protobuf支持多种编程语言,包括C++、Java、Python、PHP、Go等,通过编译proto文件生成对应的语言版本,实现跨语言数据互解。
在设计使用场景时,Protobuf尤其适用于对消息大小敏感或数据量不大的场景,如APP登录过程中的数据交互。与XML相比,Protobuf在性能和空间效率上具有显著优势,其二进制格式使得文件体积更小,传输速度更快。
在选择序列化协议时,主要考虑的因素包括性能、数据大小、维护复杂度等。Protobuf在性能和空间效率上的表现优异,同时支持动态类型和嵌套类型,使得其在处理复杂数据结构时更加灵活。此外,Protobuf还支持注释、服务定义等特性,libcrypt 源码进一步增强了其应用的多样性和便利性。
要开始使用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,reactdom源码后续步骤将通过其进行操作。
安装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文件,并在客户端和服务器项目中集成。源码工程通过设置头文件路径、预处理器定义、库目录和附加依赖项,连接所有依赖,完成gRPC的测试和集成。使用protobuf实现序列化与反序列化
protobuf是用来干嘛的?
protobuf是一种用于对结构数据进行序列化的工具,从而实现数据存储和交换。(主要用于网络通信中收发两端进行消息交互。所谓的“结构数据”是指类似于struct结构体的数据,可用于表示一个网络消息。当结构体中存在函数指针类型时,直接对其存储或传输相当于是“浅拷贝”,而对其序列化后则是“深拷贝”。)
序列化:将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化:在其他的计算环境中,将序列化后的数据还原为数据结构和对象。
从“序列化”字面上的理解,似乎使用C语言中的struct结构体就可以实现序列化的功能:将结构数据填充到定义好的结构体中的对应字段即可,接收方再对结构体进行解析。
在单机的不同进程间通信时,使用struct结构体这种方法实现“序列化”和“反序列化”的功能问题不大,但是,在网络编程中,即面向网络中不同主机间的通信时,则不能使用struct结构体,原因在于:
(1)跨语言平台,例如发送方是用C语言编写的程序,接收方是用Java语言编写的程序,不同语言的struct结构体定义方式不同,不能直接解析;
(2)struct结构体存在内存对齐和CPU不兼容的问题。
因此,notnull源码在网络编程中,实现“序列化”和“反序列化”功能需要使用通用的组件,如 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:数据持久化接口实现
注:在实际应用中,应将通讯录数据存储至数据库,此处为简化流程,以本地文件作为数据存储。