最近复习项目看到了Protobuf正好复习一下这个二进制序列化格式怎样使用什么是序列化什么是反序列化序列化是将数据结构或对象状态转换为可存储或传输的格式的过程。反序列化则是将其转换回原始数据结构的过程。因为是二进制格式计算机处理起来效率更高通常用于持久化存储存入磁盘、数据传输、跨语言之间共享如何使用1.确定数据格式数据可简单可复杂2.创建一个新的文件文件名随意指定文件后缀为proto3.根据protobuf的语法,编辑.proto文件4.使用protoc命令将.proto文件转化为相应的C文件源文件:xxx.pb.cc--xxx对应的名字和pfoto文件名相同。头文件:xxx.pb.h -xxx对应的名字和.proto文件名相同5.需要将生成的c文件添加到项目中通过文件中提供的类API实现数据的序列化/反序列化Protobuf类型与C类型对应关系序列化函数//将序列化的数据 数据保存到内存中 //将类对象中的数据序列化为字符串c 风格的字符串参数是一个传出参数 bool SerializeToString(std::string* output) const; // 将类对象中的数据序列化为字符串c风格的宇符串参数 data是一个传出参数 bool SerializeToArray(void* data, int size) const; // 写磁盘文件 //-- 需要提供流对象/文件描述符关联一个磁盘文件 bool SerializeTo0stream(std::ostream* output) const; bool SerializeToFileDescriptor (int file_descriptor) const;反序列化函数bool ParseFromString(const std::string data); bool ParseFromArray(const void* data, int size) ; bool ParseFromIstream(std::istream* input); bool ParseFromFileDescriptor(int file_descriptor); // 谁调用函数就解析给谁实战1.完成CMakeList.txt文件cmake_minimum_required(VERSION 3.15) project(test) #查找源文件 aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC) #定义静态库的路径 set(LIB ${CMAKE_CURRENT_SOURCE_DIR}/lib) set(LIBRARY_OUTPUT_PATH ${LIB}) #生成静态库 add_library(test STATIC ${SRC}) #后续需要protobuf中的api需要链接protobuf动态库 target_link_libraries(test protobuf)2.创建Person.proto文件并根据person结构体完成message person结构体(注意如果一个对象是数组要在这个对象前面加repeated关键字例如repeated int32 num 5;)记着后面把Person结构体删掉3.终端输入命令protoc ./Person.proto --cpp_out./protoc ./Person.proto --cpp_out./ ./Person.proto当前文件的位置 ./ 要生成文件的位置在Person.pb.h中可以看到对这些成员的一些“通用方法”在这里以name这个成员变量总结一下clear_name() 清除 name() 获取name只读 set_name() 设置name mutable_name() 获取name的地址可读可写 如果是数组还有一些其他方法 int name_size() 数组长度 name(index) 下标为index的值 mutable_name(index) 下标为index的值的地址 set_name(index, value) 下标为index的值改为value add_name() 申请内存 add_name(...) 既申请了内存又初始了值4.创建头文件与源文件大家自己肯定能看懂下面的代码