本周在安装Protobuf的时候,参考了很多大佬的文章,但奈何本人愚笨全都安装失败。对于VS也不太熟,所以就破罐子破摔随便设了设,居然成功了,特此写了这篇文章供大家参考(本文所写内容均为在本人电脑中的实测结果,不保证所有通用仅供参考。)
简介
Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。
也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些应用场景中序列化方面的类比,但个人认为XML作为一种扩展标记语言和Protobuf还是有着本质区别的),其具有以下特点:
- 语言无关,平台无关
Protobuf支持Java, C++, Python等多种语言,支持多个平台。 - 高效
比XML更小(3~10倍),更快(20 ~ 100倍),更为简单。 - 扩展性,兼容性好
你可以更新数据结构,而不影响和破坏原有的旧程序。
Protobuf 安装
个人理解:我认为protobuf的使用,无论是哪种语言,想要使用均是需要将。.proto文件转换成该语言所需要的支持库文件如c++的.h/.cpp、python的.py文件、Java的.java文件。而所谓的protobuf的安装就是指设置开发项目的支持库或windows 的支持库配置问题。
安装环境:window10、VS2019
下载Protobuf:https://github.com/protocolbuffers/protobuf/releases,本次教程中我下载的是3.12.3(建议下载最新版本的,我在使用过程中发现按照老版本的会出现编译后提示错误问题)
Python 环境安装:(只安装C++环境的可以跳过此部分)
python环境相对安装比较简单。
一、Protobuf下载,此处下载的是protoc-3.12.3-win64.zip,可根据自己的实际情况选择win32 或win64。
二、解压,有如下目录
三、在bin目录中有个protoc.exe文件这个就是用以编译我们写的.proto文件(仅使用python 的同学可以将此目录加入PATH中方便使用)
四、编写测试程序
示例 students.proto(新建文本文档即可)
syntax = "proto3";//定义protobuf的版本,默认为proto2
package Students;//定义名称
message AddressBook {
repeated Person people = 1;
}
//定义基本信息
message Person {
string name = 1;
int32 id = 2;
float money =3;
string email= 4;
bool work_status = 5;
}
生成python支持文件,指令为:".\protoc --python_out=.\ Students.proto"使用方法如图(我为了方便便直接 在bin目录中使用的.)
然后会生成Students_pb2.py的支持文件,我们使用事只需将此文件引用即可
五、python测试程序:
#! /usr/bin/env python
import Students_pb2
address_book = Students_pb2.AddressBook()
person = address_book.people.add()
person.id = 1
person.name = "safly"
person.email = "safly@qq.com"
person.money = 1000.11
person.work_status = True
#序列化
serializeToString = address_book.SerializeToString()
print(serializeToString,type(serializeToString))#输出序列化
address_book.ParseFromString(serializeToString)
for person in address_book.people:
print("p_id:{},\np_name:{},\np_email:{},\np_money:{},\np_workstatu:{}"
.format(person.id,person.name,person.email,person.money,person.work_status))
运行结果应为:
就此表示Python下的Protobuf安装完成。
C++环境安装(VS2019):
一、下载Protobuf安装包:
(下载-cpp版或-all版一样,本文下载的是-all。)同时依然建议下载最新版,因为老版容易报错(反正老版我没安装成功过),我当前最新为3.12.3.
二、下载解压后如下
三、下载CMake工具:
https://cmake.org/download/(版本不做要求)
按照如下目录操作:
在VS生成目录中会出现如下
四、双击.sln 打开VS程序,右键生成如下两个项目(也可以生成ALL_BUILD但我有错误)
生成成功后在根目录中会出现一个Debug(也有可能是Release目录关键的是VS中调试器的选择),有如下文件,关键的有如下图标出的即可:(为了方便使用可以将protoc.exe目录加入path中)
五、测试:新建students.proto(新建文本文档即可)
syntax = "proto3";//定义protobuf的版本,默认为proto2
package Students;//定义名称
message AddressBook {
repeated Person people = 1;
}
//定义基本信息
message Person {
string name = 1;
int32 id = 2;
float money =3;
string email= 4;
bool work_status = 5;
}
利用cmd输入"protoc --cpp_out=.\ Students.proto"具体用法如图:
会生成如下图的两个C++文件:我们需要将此两个文件(.cc,.h)复制到下面创建的VS程序的根目录之中.
六、新建VS程序(c++控制台即可)
七:配置VS程序(此部分本人不是很懂,就用了最笨的方法能多绝不少(轻喷)/(ㄒoㄒ)/~~)
1)将上部分(.proto)生成的.cc和.h复制到根目录之中,并在VS中右键添加进项目
2)右键项目->属性->配置属性->VC++目录,如下两个中加入第四步生成的Debug 目录
注:配置管理器一定要与生成.lib文件时(即第五步中)相符否则会报错
3)、C/C++ ->常规->附加包含目录 :加入本项目的根目录和第二步解压后文件夹中的src目录下的google目录
4)、运行库改为MTd
5)、连接器->输入->依赖库:加入libprotobufd.lib;libprotocd.lib;
至此程序 配置算是基本完成。
八、VS测试程序
#include <iostream>
#include "Students.pb.h"
using namespace std;
int main()
{
Students::Person person;
person.set_name("zhangsan");
person.set_id(11633);
person.set_email("123456@452.com");
person.set_money(63.5);
person.set_work_status(false);
string s = person.SerializeAsString();//序列化
if (s.size() == 0) {
cout << "error in SerializeAsString\n" << endl;
}
Students::Person nAccount;
//反序列化
if (nAccount.ParseFromString(s)) {
cout << "name:" << nAccount.name() << endl;
cout << "id:" << nAccount.id() << endl;
cout << "email:" << nAccount.email() << endl;
cout << "money:" << nAccount.money() << endl;
cout << "work_status:" << nAccount.work_status() << endl;
}
else {
cout << "error in ParseFromString\n" << endl;
}
}
运行结果为:
至此全篇结束!!!
谢谢观看