专栏首页编程技术专栏protobuf编译、安装和简单使用C++(Windows+VS平台)
原创

protobuf编译、安装和简单使用C++(Windows+VS平台)

windows下安装Protobuf

首先需要下载源代码

下载如下cpp版本

解压后得到一个目录,等下CMake会用到

如果你电脑没有CMake,需要去官网下载

双击打开下载解压后的CMake目录/bin/cmake-gui.exe

现在,选择刚才解压的目录,和构建输出目录

然后选择Configure

选择你的VS版本,然后finish即可

点击Generate,成功后,进入生成后的目录

使用VS打开这个项目

编译libprotobuf,protoc,libprotoc这三个

编译就结束了,接下来开始使用protobuf

VS中使用protobuf

在自己创建的项目下,新建一个Account.proto,内容如下

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

message User {
	Account user = 1;
}

将刚才编译后的libprotobufd.libprotoc.exe拷贝到自己创建的项目下,按住shift+右键,选择打开CMD,输入protoc --cpp_out=./ Account.proto,发现目录中多了两个文件,一个.h头文件一个.cc源文件

打开Account.pb.h头文件,发现package就是命名空间,Account是类,大概如下代码

namespace IM {
    class Account {
        //一些方法
    };
    class User {
        //一些方法
    }
};

然后将生成的代码手动添加到项目中,

接下来的步骤比较关键

先将平台设置为所有平台

右键打开项目的属性,修改一下属性

关闭安全警告_SCL_SECURE_NO_WARNINGS

添加之前编译好的库

添加之前拷贝到项目中的库如果有多个.lib,需要用分号隔开

还要将protobuf源码中src/google文件夹拷贝到项目目录下

然后设置包含你的项目目录

然后,开始写代码了

#include <iostream>
#include <fstream>
#include "Account.pb.h"

using namespace std;

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

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


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

	google::protobuf::ShutdownProtobufLibrary();

	return 0;
}

运行结果:

protobuf的一些方法

标准消息函数(Standard Message Methods)。 每一个消息(message)还包含了其他一系列函数,用来检查或管理整个消息,包括:

bool IsInitialized() const; //检查是否全部的required字段都被置(set)了值。

void CopyFrom(const Person& from); //用外部消息的值,覆写调用者消息内部的值。

void Clear();   //将所有项复位到空状态(empty state)。

int ByteSize() const;   //消息字节大小

关于Debug的API。

string DebugString() const; //将消息内容以可读的方式输出

string ShortDebugString() const; //功能类似于,DebugString(),输出时会有较少的空白

string Utf8DebugString() const; //Like DebugString(), but do not escape UTF-8 byte sequences.

void PrintDebugString() const;  //Convenience function useful in GDB. Prints DebugString() to stdout.

关于解析&序列化(Parsing and Serialization)。

最后,每一个protocol buffer类都有读写你所选择的消息类型的函数。它们包括:

**注意:** protocol buffers和面向对象的设计 protocol buffer类通常只是纯粹的数据存储器(就像C++中的结构体一样);它们在对象模型中并不是一等公民。如果你想向生成的类中添加更丰富的行为,最好的方法就是在应用程序中对它进行封装。如果你无权控制.proto文件的设计的话,封装protocol buffers也是一个好主意(例如,你从另一个项目中重用一个.proto文件)。在那种情况下,你可以用封装类来设计接口,以更好地适应你的应用程序的特定环境:隐藏一些数据和方法,暴露一些便于使用的函数,等等。但是你绝对不要通过继承生成的类来添加行为。这样做的话,会破坏其内部机制,并且不是一个好的面向对象的实践。
bool SerializeToString(string* output) const; //将消息序列化并储存在指定的string中。注意里面的内容是二进制的,而不是文本;我们只是使用string作为一个很方便的容器。

bool ParseFromString(const string& data); //从给定的string解析消息。

bool SerializeToArray(void * data, int size) const  //将消息序列化至数组

bool ParseFromArray(const void * data, int size)    //从数组解析消息

bool SerializeToOstream(ostream* output) const; //将消息写入到给定的C++ ostream中。

bool ParseFromIstream(istream* input); //从给定的C++ istream解析消息。

这些函数只是用于解析和序列化的几个函数罢了。请再次参考Message API reference以查看完整的函数列表。

注意: protocol buffers和面向对象的设计 protocol buffer类通常只是纯粹的数据存储器(就像C++中的结构体一样);它们在对象模型中并不是一等公民。如果你想向生成的类中添加更丰富的行为,最好的方法就是在应用程序中对它进行封装。如果你无权控制.proto文件的设计的话,封装protocol buffers也是一个好主意(例如,你从另一个项目中重用一个.proto文件)。在那种情况下,你可以用封装类来设计接口,以更好地适应你的应用程序的特定环境:隐藏一些数据和方法,暴露一些便于使用的函数,等等。但是你绝对不要通过继承生成的类来添加行为。这样做的话,会破坏其内部机制,并且不是一个好的面向对象的实践。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CentOS7安装protobuf(C++)和简单使用

    此时可能会遇到报错,如:autoreconf: command not found

    WindSun
  • 一次完整的HTTP请求过程

    a)首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存)

    WindSun
  • C++的多态总结(静态&动态)

    我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话...

    WindSun
  • 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全

    【导读】作者整理了近期最新发布及更新的 12 个非常有学习和收藏意义的开源项目。这些项目中包括基于 TensorFlow 的强化学习框架;可以对数据进行结构化处...

    zenRRan
  • 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全

    【导读】作者整理了近期最新发布及更新的 12 个非常有学习和收藏意义的开源项目。这些项目中包括基于 TensorFlow 的强化学习框架;可以对数据进行结构化处...

    CDA数据分析师
  • 大家都收藏了的最新开源项目Top12!CV、NLP、机器学习一应俱全

    【导读】作者整理了近期最新发布及更新的 12 个非常有学习和收藏意义的开源项目。这些项目中包括基于 TensorFlow 的强化学习框架;可以对数据进行结构化处...

    AI科技大本营
  • 使用concurrent.futures模块并发,实现进程池、线程池

    一、关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进...

    用户1214487
  • 苹果机器学习开发日记:如何设计能在Apple Watch上实时运行的中文手写识别系统

    AI 科技评论按:随着苹果机器学习日记(Apple ML Journal)的开放,苹果分享出的设计自己产品、运用机器学习解决问题的故事也越来越多。近日苹果在上面...

    AI科技评论
  • 洞察|深挖大数据“钻石矿” 共享经济成资本追逐热点

    2016年,《政府工作报告》中首次引入了共享经济概念,李克强总理亦将共享经济列为深挖大数据“钻石矿”的一大利器。 目前,共享经济模式正在悄然改变我们的生活。U...

    灯塔大数据
  • myeclipse(eclipse)乱码处理

    Java学习123

扫码关注云+社区

领取腾讯云代金券