Protocol Buffers协议笔记

之前二进制序列化火热时Thrift和Protocol Buffers是最常用的协议,这次因为要写protobuf的Java程序,做些简单的记录。

常用数据序列化协议

  • JSON : 不用多介绍,Restful中最常用的,可读性好
  • Protocol Buffers:Google的开源RPC数据协议,最新版protobuf3
  • MessagePack : Locust二次开发用过,性能更好的类JSON二进制协议
  • Thrift:Facebook开源的跨语言数据协议

数据定义

下面用到的示例程序参考文末链接。

数据结构定义,album.proto

syntax = "proto3";
option java_outer_classname = "AlbumProtos";
option java_package = "com.xulizhao.protobuf";
message Album {
    string title = 1;
    repeated string artist = 2;
    int32 release_year = 3;
    repeated string song_title = 4;
}

说明:repeated代表是一个List类型的字段,之后通常用AddAllXxx()或AddXxx()构造数据。

命令行使用

# 生成Java Code
protoc.exe --java_out=. album.proto

# 生成数据描述文件,Charles之类工具会用到
protoc.exe -oalbum.desc album.proto

Java代码解释

自动生成的Java代码实际包含了数据类定义和Builder方法等。

// 构造数据实例
AlbumProtos.Album albumMessage = AlbumProtos.Album.newBuilder().setTitle(album.getTitle()).build();
// 数据实例转化为二进制
final byte[] binaryAlbum = albumMessage.toByteArray();
// 二进制解析为数据实例
AlbumProtos.Album copiedAlbumProtos = AlbumProtos.Album.parseFrom(binaryAlbum);

参考