protocol精讲(一)

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.xicon-default.png?t=N7T8https://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)icon-default.png?t=N7T8https://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程序员研修院icon-default.png?t=N7T8https://edu.csdn.net/course/detail/26148

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值