protocol buffers快速入门 - go语言版

 提示:转载请注明原文链接

 本文链接:https://360us.net/article/66.html

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目前支持生成的代码的有javapythonObjective-CC++DartGoRubyC#。具体可以看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包提供的MarshalUnmarshal方法来编码和解码数据,没有什么复杂的操作。

protocol buffers和xm,json这些类似的,都是用来编码、解码数据,方便传输、存储来使用的。

本文的目的是希望新手(当然我也是新手)能够快速的了解和使用protocol buffers,更多高级内容可以自行搜索,或者访问官方说明

希望本文对你有所帮助。

本文链接:https://360us.net/article/66.html


本文链接:https://360us.net/article/66.html