1、序列化
序列化:从一个对象变为一个内存里面一堆数据,就是一个字节流
反序列化:将一个字节流的内容拷贝到一个对象空间里面,也就是将一个字节流变为一个对象
两方面的应用:
a. 建一个对象,转化为字节字节流,然后可以将这个字节流通过网络发送出去,在另外一边,将这个字节流转化一个对象
b. 建一个对象,转化为字节字节流,一个字节流写到一个文件里面,再从文件里面将这个字节流读出来,然后再将它转化一个对象
1.1、例程
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
typedef struct Student
{
int age;
int tall;
int score;
std::string name;
} stu_t;
//
void write_to_file(const char*filename, const char*buff, size_t len)
{
std::ofstream of(filename, std::ios::binary | std::ios::trunc);
if (of)
{
of.write(buff, len);
of.close();
}
}
int main()
{
stu_t stu; // 对象
stu.age = 18; // 赋值
stu.tall = 170;
stu.score = 110;
stu.name = "zhangshan";
char*pp = (char*)malloc(sizeof(stu_t)); // 开辟空间
memset(pp, 0, sizeof(stu_t)); // 初始化
memcpy(pp, &stu, sizeof(stu_t)); // 拷贝
write_to_file("stu222", pp, sizeof(stu_t)); // 序列号操作 写入文件
}
1.2、运行结果
2、反序列化
2.1、例程
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
typedef struct Student
{
int age;
int tall;
int score;
std::string name;
} stu_t;
//
void write_to_file(const char*filename, const char*buff, size_t len)
{
std::ofstream of(filename, std::ios::binary | std::ios::trunc);
if (of)
{
of.write(buff, len);
of.close();
}
}
//
void read_from_file(const char*filename, char*buff, size_t len)
{
std::ifstream ifile(filename, std::ios::binary);
if (ifile)
{
ifile.read(buff, len);
ifile.close();
}
}
int main()
{
stu_t stu; // 对象
stu.age = 18; // 赋值
stu.tall = 170;
stu.score = 110;
stu.name = "zhangshan";
char*pp = (char*)malloc(sizeof(stu_t)); // 开辟空间
memset(pp, 0, sizeof(stu_t)); // 初始化
memcpy(pp, &stu, sizeof(stu_t)); // 拷贝
write_to_file("stu222", pp, sizeof(stu_t));
read_from_file("stu222", pp, sizeof(stu_t));
stu_t stu2;
memcpy(&stu2, pp, sizeof(stu_t)); // 反序列号操作
std::cout << "age:" << stu2.age << "\ttall:"
<< stu2.tall << "\tscore:" << stu2.score
<< "\tname:" << stu2.name << std::endl;
std::cout << "age:" << stu.age << "\ttall:"
<< stu.tall << "\tscore:" << stu.score
<< "\tname:" << stu.name << std::endl;
std::cin.get();
}
2.2、运行结果
age:18 tall:170 score:110 name:zhangshan
age:18 tall:170 score:110 name:zhangshan
3、跨平台编译工具cmake
3.1、Window下cmake的安装
cmake下载:Download CMake
cmake安装,添加到环境变量
3.2、Linux下cmake的安装
略
4、在Windows平台下编译protobuf
4.1、protobuf下载
GitHub - protocolbuffers/protobuf at 4.0.xhttps://github.com/protocolbuffers/protobuf/tree/4.0.x
4.2、解压和编译
a. 解压
b. cmakelists定义了相关的编译规则
c. 新建“build”文件夹,存放编译的东西
d. 打开cmd命令行的两种方式:打开命令行工具,去到E盘的demo文件夹下的build文件夹;或者直接在build文件夹的路径栏上输入cmd打开
e. 输入“cmake ..”命令(cmake跨平台编译工具)(..表示上一个目录)进行编译
或者,安装了visual studio的话,在build文件夹下,按“Shift”键,鼠标右键选择“在此处打开Powershell窗口”
图 1
图 2
f. 出现错误,跳过测试
图 1
图 2
g. 成功生成
h. 在windows平台中,假如安装了visual studio的话,运行cmake编译就会生成visual studio工程文件
i. 打开visual studio工程,一个解决方案下面有多个工程项目
j. 在解决方案上面右键 -> 生成解决方案
k. 在目录下找到“debug”文件夹
5、protocol的简单使用
5.1、新建项目
5.2、新建.cpp文件
5.3、编译proto文件
addressbook.proto文件
syntax = "proto2";
package tutorial;
message Person{
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber{
required string number = 1;
optional PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
message AddressBook{
repeated Person people = 1;
}
Protocol Buffers官网教程:Protocol Buffers Documentation (protobuf.dev)https://protobuf.dev/
图 1
图 2
图 3
为了方便,直接将addressbook.proto文件放到上一节编译protobuf时的Debug文件夹内
然后执行指令:
.\protoc.exe --cpp_out=. .\addressbook.proto
将.pb.cc和.pb.h文件复制到项目根目录下
5.4、项目头文件添加.pb.h文件
5.5、同理,项目源文件添加.pb.cc文件
5.6、添加库和头文件路径,在项目上面右键 -> 属性
头文件路径
库目录路径
添加依赖项
添加进来的是静态库,修改运行库
5.7、运行测试
引用
protobuf精讲_在线视频教程-CSDN程序员研修院https://edu.csdn.net/course/detail/26148