Protobuf和Java

来源:互联网 发布:linux php不支持mysql 编辑:程序博客网 时间:2024/06/13 19:09

Protobuf简介

Protobuf是Google开源的二进制序列化数据协议。具有语言和平台无关性,支持多种语言接口。

Protobuf的优点:

1,通用性:多种语言支持
2,速度快:较比其他序列化格式如Json,XML编解码速度更快
3,小:因为是二进制格式,所以更小

缺点:

1,没有自描述性:因为是二进制,内容经过编码

Protobuf语法

Protobuf定义的数据格式类似于Java中的entity,而且使用protoc库可以把它转化成Java的Entity。

Protobuf定义一个数据的属性,转化成的Java类会自动添加其Getter和Setter方法以及其他辅助方法。

Protobuf的一个数据类成为message,protobuf有类似于C语言的数据类型,与其他语言的基本数据类型可以一一对应,如下:
这里写图片描述

Protobuf的数据可以设置为:requiredoptionalrepeated

required是必须存在字段,optional是可选字段,可以为空;repeated是可重复字段,转化成Java是一个List,可以存放0个,1个或多个元素。

每一个字段有一个整数唯一标识,感觉就像一个map的Key值。

Protobuf支持嵌套,即message套message。

以下例子可以阐述以上的所有规则:

message SearchResponse {  message Result {    required string url = 1;    optional string title = 2;    repeated string snippets = 3;  }  repeated Result result = 1;}

Protobuf的应用实例

举一个例子来阐述protobuf-Java从头到尾的使用过程。

首先需要下载protobuf源代码,我选择2.5.0

下载下来的源代码根据README里面的内容进行安装。进入java文件夹,java的源码是一个maven项目,根据里面的README.txt可以进行maven安装或非maven安装,安装后在target文件夹中有protobuf-java-2.5.0.jar,这就是我们在Java项目中用来序列和反序列化protobuf数据的依赖包。

使用IDE创建一个测试的MAVEN项目,目录结构如下图:

这里写图片描述

在pom.xml添加依赖:

        <dependency>            <groupId>com.google.protobuf</groupId>            <artifactId>protobuf-java</artifactId>            <version>2.5.0</version>        </dependency>

会自动导入jar包;或者手动将上面说的protobuf-java-2.5.0.jar加到项目中。

写proto

message Person {    // ID(必需)    required int32 id = 1;    // 姓名(必需)    required string name = 2;    // email(可选)    optional string email = 3;    // 朋友(集合)    repeated string friends = 4;}

在命令行使用protoc命令将.proto编译成java类:

protoc --java_out=$DST_DIR $SRC_DIR/Person.proto

DSTDIRjavaSRC_DIR是proto文件所在路径。将生成的java类放到项目的java文件夹下。

创建main类

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.List;public class Main {    public static void main(String[] args) throws IOException {        // 按照定义的数据结构,创建一个Person        PersonMsg.Person person = PersonMsg.Person.newBuilder()            .setId(1)            .setName("wayblink")            .setEmail("xxx@gmail.com")            .addFriends("Zhang 3")            .addFriends("Li 4").build();        // 将数据写到输出流,如网络输出流,这里就用ByteArrayOutputStream来代替        ByteArrayOutputStream output = new ByteArrayOutputStream();        person.writeTo(output);        // -------------- 分割线:上面是发送方,将数据序列化后发送 ---------------        byte[] byteArray = output.toByteArray();        // -------------- 分割线:下面是接收方,将数据接收后反序列化 ---------------        // 接收到流并读取,如网络输入流,这里用ByteArrayInputStream来代替        ByteArrayInputStream input = new ByteArrayInputStream(byteArray);        // 反序列化        PersonMsg.Person person2 = PersonMsg.Person.parseFrom(input);        System.out.println("ID:" + person2.getId());        System.out.println("name:" + person2.getName());        System.out.println("email:" + person2.getEmail());        System.out.println("friend:");        List<String> friends = person2.getFriendsList();        for(String friend : friends) {            System.out.println(friend);        }    }}

Proto的序列化与反序列化方法都在这个main方法中了。

运行:

ID:1name:wayblinkemail:xxx@gmail.comfriend:Zhang 3Li 4
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 地铁买票买多了怎么办 免税店买的东西转机怎么办 绿能电动车坏了怎么办? 永久单车收不到验证码怎么办 24速山地车档乱了怎么办 新电瓶车被偷了怎么办 汽车前风挡玻璃砸出洞怎么办 凯迪拉克xt5钥匙掉了怎么办 凯迪拉克xt5媒体不好用怎么办 晒黄的白鞋怎么办 白鞋子被晒黄了怎么办? 耐克空军一号白色发黄怎么办 空军一号破皮了怎么办 匡威鞋帆布破了怎么办 脚腕起疙瘩很痒怎么办 跑步后脚踝微疼怎么办 跑步跑得脚疼怎么办 nike air 鞋头脱胶怎么办 耐克空军一号磨脚怎么办 白鞋刷完变黄了怎么办 乔丹气垫坏了怎么办 气垫鞋气垫坏了怎么办 建行u盾忘记密码怎么办 工商银行u盾忘记密码怎么办 民生银行不给u盾怎么办 银行不给开u盾怎么办 有车有空想赚点外快怎么办 车被注册了滴滴怎么办 快手号手机丢了怎么办 手机号码不停收到验证码怎么办 手机网页滑动自动跳到最下面怎么办 网页一打开就跳至评论怎么办? 百度总出现重复的网页怎么办 苹果7一直处于系统升级页面怎么办 手机看百度文章总是跳转怎么办 美度舵手滑丝怎么办 小区房产证办不下来怎么办 美海军陆战队进驻台湾大陆怎么办? 束脚裤带子怎么办系 眼角弄伤了应该怎么办 浴盆下水盖坏了怎么办