protocol buffers(简称protobuf)是google搞的,是用来序列化数据的一种数据格式,类似于json、xml等这种。
本文其他概念不讲直接讲基本用法了。
首先需要定义数据结构,数据结构定义写在一个扩展名是.proto
的文本文件里面,这个文件叫做proto
文件。
protobuf的数据叫message
,每一个消息都是一系列名值对,我们把他叫做fields
,当然还有更复杂的结构,这就不在这里讨论了。
例如:
syntax = "proto3"; #版本
package tutorial; #包名
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
package
包名是为了避免不同项目的名字冲突。
上面就是我们定义的数据结构,然后用protobuf的编译器protoc
去生成指定语言的数据访问代码,提供了简便的方法来操作整个结构的二进制数据。
protobuf目前支持生成的代码的有java
、python
、Objective-C
、C++
、Dart
、Go
、Ruby
和C#
。具体可以看https://developers.google.com/protocol-buffers/。
这里以go语言为例,来测试一个试试。
首先需要安装protobuf的C++编译器。
可以参考这里安装:https://github.com/protocolbuffers/protobuf/blob/master/src/README.md
下面是参考步骤(系统是Debian9 64位系统,当前目录在用户的home目录):
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protobuf-cpp-3.8.0.tar.gz
tar -xzf protobuf-cpp-3.8.0.tar.gz
cd protobuf-3.8.0
./configure
make
sudo make install
安装好后protoc
命令就是可用了。
然后是安装go语言代码生成插件了。
参考说明:https://github.com/golang/protobuf
参考步骤:
go path设置:GOPATH="/home/dev/gopath"
。
然后还要设置go path的bin目录到path
环境变量里面去,这样protoc
才能找到插件,export PATH="$PATH:$GOPATH/bin"
。
go get -u github.com/golang/protobuf/protoc-gen-go
一条命令就完成了,方便。
然后我们在数据定义同目录下面执行命令protoc --go_out=. *.proto
,就生成了对应的go代码的。
更为完整的命令protoc -I=/home/dev/grpc --go_out=/home/dev/grpc /home/dev/grpc/person.proto
,-I
是源文件目录,--go_out
是输出go文件的目标目录,最后是指定要编译的文件。
其它语言也都是类似的方式生成对应语言的代码。
执行完上面的命令之后,会生成一个pb.go
的文件。
生成了go文件代码之后,就可以读写message
了。
说再多也不如直接上代码来的明了。
新建了一个名称是protobuf_demo
测试项目,需要把上面生成的代码复制到项目下面,main.go
代码如下:
//@link https://360us.net/article/66.html
package main
import (
"log"
"io/ioutil"
pb "protobuf_demo/tutorial"
proto "github.com/golang/protobuf/proto"
)
func main(){
fname := "protobuf"
person := &pb.Person{
Name: "person1号",
Id: 10,
}
//写
out, err := proto.Marshal(person)
if err != nil {
log.Fatalln("Failed to encode address book:", err)
}
if err := ioutil.WriteFile(fname, out, 0644); err != nil {
log.Fatalln("Failed to write address book:", err)
}
//读
in, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatalln("Error reading file:", err)
}
inPerson := &pb.Person{}
if err := proto.Unmarshal(in, inPerson); err != nil {
log.Fatalln("Failed to parse address book:", err)
}
log.Println(inPerson)
log.Println(inPerson.Name)
log.Println(inPerson.Id)
}
总体上就是通过proto
包提供的Marshal
和Unmarshal
方法来编码和解码数据,没有什么复杂的操作。
protocol buffers
和xm,json这些类似的,都是用来编码、解码数据,方便传输、存储来使用的。
本文的目的是希望新手(当然我也是新手)能够快速的了解和使用protocol buffers
,更多高级内容可以自行搜索,或者访问官方说明。
希望本文对你有所帮助。
本文链接:https://360us.net/article/66.html
本文链接:https://360us.net/article/66.html