vs2019 c++中使用goole protobuf

在自己创建的项目下(这里项目名为ProtoBufTest),新建一个Account.proto,内容如下

syntax = "proto3";
package IM;
message Account {
	//账号
	uint64 ID = 1;
	//名字
	string name = 2;
	//密码
	string password = 3;
}
 
message User {
	Account user = 1;
}

proto中支持的标量类型

double
float
int32
int64

//无符号整数
uint32
uint64

//有符号,可用来加密有负数的整数
sint32  
sint64  

//固定整型,字节数固定,如果整数的取值范围占用字节数固定在4个或者八个字节,可以使用如下的类型
fixed32 //4字节
fixed64 //8字节
sfixed32 //4字节
sfixed64 //8字节

//bool
bool

//string,必须为UTF-8或者ASCII码
string 

//bytes,可以包含任意的bytes序列,长度不超过2^32次方
bytes 

具体可以参考https://blog.csdn.net/qq_39378657/article/details/109237465
vs2019 c++中使用goole protobuf_第1张图片
将编译好的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下
vs2019 c++中使用goole protobuf_第2张图片
按住shift+右键,选择打开CMD,输入protoc --cpp_out=./ Account.proto
vs2019 c++中使用goole protobuf_第3张图片
在这里插入图片描述
or vs下
在这里插入图片描述
发现目录中多了两个文件,一个.h头文件一个.cc源文件
vs2019 c++中使用goole protobuf_第4张图片
然后将生成的代码手动添加到项目中
vs2019 c++中使用goole protobuf_第5张图片

vs要设置的关键步骤

1.先将平台设置为所有平台
vs2019 c++中使用goole protobuf_第6张图片
2.多线程调试(/MTd)
vs2019 c++中使用goole protobuf_第7张图片
3.关闭安全警告_SCL_SECURE_NO_WARNINGS
vs2019 c++中使用goole protobuf_第8张图片
4.添加之前拷贝到项目中的库libprotobufd.lib,如果有多个.lib,需要用分号隔开
vs2019 c++中使用goole protobuf_第9张图片
5.还要将protobuf源码中src/google文件夹拷贝到项目目录下,即从ProtoBuf解压出的那个文件目录
vs2019 c++中使用goole protobuf_第10张图片
vs2019 c++中使用goole protobuf_第11张图片
6.然后设置包含你的项目目录
vs2019 c++中使用goole protobuf_第12张图片
7.将解决方案平台改为x64(重要!),这个根据编译的库来确定平台,如下编译的库为x86,则调整为x86
vs2019 c++中使用goole protobuf_第13张图片
8. 代码示例

例1

#include 
#include 
#include "Account.pb.h"

using namespace std;

int main(int argc, char** argv)
{
  IM::Account account1;
  account1.set_id(123);
  account1.set_name("xxx");
  account1.set_password("123456");

  string serializeToStr;
  account1.SerializeToString(&serializeToStr);
  cout << "C++ String的序列化后的字节1:" << serializeToStr << endl;

  uint8_t byteArray[32] = {0};
  account1.SerializeToArray(byteArray,sizeof(byteArray));
  cout << "C数组的序列化后的字节2:" << byteArray << endl;

  IM::Account account2;
  if (!account2.ParseFromString(serializeToStr))
  {
    cerr << "failed to parse string." << endl;
    return -1;
  }
  cout << "C++ String的反序列化1:" << endl;
  cout << account2.id() << endl;
  cout << account2.name() << endl;
  cout << account2.password() << endl;

  IM::Account account3;
  if (account3.ParseFromArray(byteArray, sizeof(byteArray)))
  {
    cerr << "failed to parse array." << endl;
    return -1;
  }
  cout << "C数组的反序列化2:" << endl;
  cout << account3.id() << endl;
  cout << account3.name() << endl;
  cout << account3.password() << endl;

  IM::Device device1;
  device1.set_devicename("Motor");
  device1.set_serialnumber(123456);

  cout << "C++ String的序列化3:" << endl;
  std::string strDevice;
  device1.SerializeToString(&strDevice);
  cout << "序列化后的字节3:" << strDevice << endl;

  cout << "C++ String的反序列化3:" << endl;
  device1.ParseFromString(strDevice);
  cout << device1.devicename() << endl;
  cout << device1.serialnumber() << endl;

  google::protobuf::ShutdownProtobufLibrary();

  return 0;
}

输出结果如下
vs2019 c++中使用goole protobuf_第14张图片

例2

  IM::Device device2;
  fstream file("testStream.xxx", ios::in | ios::out | ios::trunc | ios::binary);  
  device2.set_devicename("Led");
  device2.set_serialnumber(666666);
  cout << "C++ stream序列化:" << endl;
  device2.SerializeToOstream(&file);

  file.flush();
  file.seekg(0, ios::beg);

  IM::Device device3;
  cout << "C++ stream反序列化:" << endl;
  device3.ParseFromIstream(&file);
  cout << "name = " << device3.devicename() << endl;
  cout << "id = " << device3.serialnumber() << endl;
  file.close();

输出结果如下
vs2019 c++中使用goole protobuf_第15张图片

你可能感兴趣的:(C++,c++,java,服务器)