protobuf入门教程(一):简介和安装

1.1 简介

1.1.1 什么是protobuf

protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。

由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

更多详情请看:https://developers.google.com/protocol-buffers/docs/overview(需要翻墙)

1.1.2 protobuf的优缺点

1.1.2.1 优点

  • 性能好/效率高
  • 代码生成机制
  • 支持“向后兼容”和“向前兼容”
  • 支持多种编程语言

1.1.2.1 缺点

  • 应用不够广(相比xml和json)
  • 二进制格式导致可读性差
  • 缺乏自描述

1.2 安装

1.2.1 Ubuntu环境搭建

github源代码下载地址:https://github.com/google/protobuf

源码包中的src/README.md, 有详细的安装说明,安装过程如下:
1、解压压缩包:unzip protobuf-master.zip

2、进入解压后的文件夹:cd protobuf-master

3、安装所需工具:sudo apt-get install autoconf automake libtool curl make g++ unzip

4、自动生成configure配置文件:./autogen.sh

5、配置环境:./configure

6、编译源代码(时间比较长):make

7、安装:sudo make install

8、刷新动态库:sudo ldconfig

1.2.2 环境测试

1.2.2.1 examples例子

在源代码包中,有个examples文件夹,把里面的addressbook.proto、add_person.cc、list_people.cc拷贝出来:
这里写图片描述

1.2.2.2 编译 .proto文件

这里写图片描述

  • protoc:protobuf自带的编译工具,将.proto文件生成指定的类
  • –cpp_out:指定输出特定的语言和路径

通过protoc工具编译.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。

对C++来说,编译器会为每个.proto文件生成一个.h文件和一个.cc文件,.proto文件中的每一个消息有一个对应的类。

1.2.2.3 编译运行测试案例
1) 写文件(序列化)

编译代码:
这里写图片描述

  • 反引号(` 数字1前面的符号):反引号的作用就是将反引号内的linux命令执行
  • pkg-config 是通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。
  • pkg-config –cflags protobuf:列出指定共享库的预处理和编译flags

这里写图片描述

运行可执行程序:
这里写图片描述

pb.xxx文件内容如下:
这里写图片描述

2) 读文件(反序列化)

这里写图片描述

参考资料:
1、http://baike.baidu.com
2、http://www.jianshu.com/p/746bb9d81380

### Protocol Buffers (Protobuf) 概述 Protocol Buffers 是种高效的结构化数据序列化协议,由 Google 开发并开源。它可用于多种编程语言之间的高效通信,在性能上优于 XML JSON 等传统格式[^2]。 #### 主要特点 - **跨平台支持**:适用于 C++、Java、Python、Go等多种主流开发环境。 - **高性能**:相较于其他序列化方案具有更快的速度更小的数据体积。 - **向后兼容性好**:可以在不破坏现有客户端的情况下扩展消息字段。 ### 安装与配置 为了能够在 Go 项目中应用 Protobuf 进行数据交换,需完成如下准备工作: - 下载并安装 `protoc` 编译器及其对应的 golang 插件[^1]。 ```bash go install google.golang.org/protobuf/cmd/protoc-gen-go@latest ``` 这步骤使得开发者能够通过 `.proto` 文件生成目标语言的具体实现代码,从而简化了不同系统间复杂对象模型的致性维护工作[^3]。 ### 创建 Proto 文件 编写 `.proto` 文件来定义所需的消息类型。下面是个简单的例子展示了如何创建登录请求的 proto 文件[^4]: ```protobuf syntax = "proto3"; package IM.Login; import "IM.BaseDefine.proto"; option optimize_for = LITE_RUNTIME; message IMLoginReq { string user_name = 1; string password = 2; IM.BaseDefine.UserStatType online_status = 3; IM.BaseDefine.ClientType client_type = 4; string client_version = 5; } ``` 此文件不仅限定了各个属性的名字编号,还指明了其所属包名以及引入外部依赖项的方式。 ### 序列化与反序列化操作 旦拥有了上述准备好的 `.proto` 文件之后,便可以利用编译工具将其转化为具体语言版本下的类库供程序调用了。对于 Go 来说,则会得到组用于构建、读取二进制流的方法集合,进而实现了对任意实例状态的有效保存恢复机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值