protobuff 是谷歌的一个广泛用于前后端通信的序列化数据格式,在平时的开发过程中前后端用于数据交互的常用数据格式就是 json 和 xml, protobuff比 xml 和 json 数据都要快因此 protobuff 在游戏行业当中使用的比较多。
使用protobuff的步骤
1 安装 protoc 编译器, 安装go 语言protobuff 包
2 定义 .proto文件
3 编译成对应语言的 pb 文件
4 使用pb文件发送或者接收数据
下载/安装 protoc 编译器
protobuf-2.5.0.tar.gz
下载地址:http://pan.baidu.com/s/1pJlZubT
解压:
tar -xf protobuf-2.5.0.tar.gz
编译:
cd protobuf-2.5.0
./configure --prefix=/home/fantasy/proto
安装:
make check
make && make install
配置 protoc 环境变量
vi ~/.bashrc
PROTOBUFF=/home/fantasy/proto/
PATH=$PATH:$PROTOBUFF/bin
export PROTOBUFF
source ~/.bashrc
安装go语言protobuff包
go get github.com/golang/protobuf/proto
go get github.com/golang/protobuf/protoc-gen-go
编写.proto 文件
如果你此前从来没有使用过 protobuff 你需要了解一下 protobuff 语法
proto2 : https://developers.google.com/protocol-buffers/docs/proto?hl=zh-CN
proto3 : https://developers.google.com/protocol-buffers/docs/proto3?hl=zh-CN
以下是我定义的 proto 文件内容
message.proto
syntax = "proto2";
package player;
enum STATUS {
WAIT = 0;
READY = 1;
RUNING = 3;
DONE = 4;
EXIT = 5;
}
message PlayerInfo {
required string nickname = 1;
required string headImageUrl = 2;
required string address = 3;
required fixed64 gender = 4;
optional string privileges = 5;
required fixed64 uid = 6;
required fixed64 coin = 7;
}
编译成对应语言的pb文件
protobuff 目前支持 c++,java,python,c#,go等
下面我就把刚定义的message.proto 使用刚才安装的protoc 编译器编程成 go 语言的 pb 文件
protoc --go_out=./ message.go
执行完成后会生成 message.pb.go 我们需要使用这个文件
使用 pb 文件
package day12
import (
"fmt"
player "proto"
"github.com/golang/protobuf/proto"
)
func SetProto() {
var gender uint64
var uid uint64
var coin uint64
name := "test"
url := "https://www.wegame.com/account/263369/287631QhgxK.png"
address := "0.0.0.0"
gender = 0
previleges := ""
uid = 123456
coin = 1
// 给 proto 定义的字段赋值
playerInfo := &player.PlayerInfo{
Nickname: &name,
HeadImageUrl: &url,
Address: &address,
Gender: &gender,
Privileges: &previleges,
Uid: &uid,
Coin: &coin,
}
// 这里的info 就是protobuff序列化之后的数据,可以直接发送了
info, err := proto.Marshal(playerInfo)
if err != nil {
fmt.Println("序列化错误", err)
}
// 反序列化protobuff数据
playerInfo2 := &player.PlayerInfo{}
err2 := proto.Unmarshal(info, playerInfo2)
fmt.Println(err2)
println("------------------- protobuff data ------------------")
fmt.Println(playerInfo2.GetNickname())
}