protobuf初体验

时间:2023-01-12 15:52:04

概念介绍

  Protocol buffers 是google公司的与语言无关、与平台无关的、可扩张的为序列化话结构数据,就像xml一样,办事更加的小巧、快速、简单。Protocol buffers 目前支持语言有Java,Python和C++。

为什么不用XML

  Protocol buffers在序列化结构数据方便比XML有很多的有点。Protocolbuffers

  • 更加简单
  • 比xml小3-10倍
  • 比xml快20-100倍
  • 比xml更少的歧义
  • 以编程方式生成数据访问类更加容易

前期准备(下载安装protocol buffers)

  官网地址:https://developers.google.com/protocol-buffers/

  由于google是被墙的,大家可以自行*,这里推荐一个网站可以直接通过添加hosts方式实现*(https://laod.cn/hosts/2016-google-hosts.html)

  下载地址:https://github.com/google/protobuf/releases/tag/v3.0.0

  下载  protobuf-java-3.0.0.zip和protoc-3.0.0-win32.zip

  下载完成之后将两个压缩包分别解压。

Eclipse安装protocol buffers dt插件

  help->install New software...

  install Xtext  地址:http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/

  isntall protobuf-dt  地址:http://junit.github.io/protobuf-dt/git/update-site/site.xml

  安装成功之后会出现如下图的一个菜单:

protobuf初体验

  配置说明如下图:

protobuf初体验

protobuf初体验

编译protobuf的jar包

  由于protobuf是通过maven管理的,并且只提供了源代码,需要自行执行打包。

  将protoc.exe文件拷贝到解压之后的protobuf-3.0.0\src目录下

  切换到protobuf-3.0.0\java目录下,执行mvn install

  protobuf初体验

  安装成功之后如下图所示:

  protobuf初体验

现在就可以开发protobuf项目了

1、添加protobuf依赖

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

2、编写person.proto文件

package proto;
option java_package="com.wjg.base.protobuf.bean";
option java_outer_classname = "PersonProto"; message Person{
required string name = ;
required int32 age =;
required string birthday = ;
required bool man = ; enum PhoneType{
MOBILE=;
HOME=;
WORK=;
} message PhoneNumber{
required string number=;
optional PhoneType type =[default = HOME];
}
repeated PhoneNumber phone =;
}

保存文件之后就会在com.wjg.base.protobuf.bean包下生成PersonProto类

现在就可以开始测试了新建junit测试类

/**
*
*/
package com.wjg.base.protobuf; import org.junit.Test; import com.google.protobuf.InvalidProtocolBufferException;
import com.wjg.base.protobuf.bean.PersonProto;
import com.wjg.base.protobuf.bean.PersonProto.Person; /**
* @author ghost
* @version 创建时间:2016年11月23日 下午5:23:59 类说明
*/
public class PersonProtoTest {
/**
* 测试序列化
*/
@Test
public void testSerialize() {
PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
builder.setAge(23);
builder.setBirthday("2016-11-23");
builder.setName("ghost");
builder.setMan(true);
builder.addPhone(Person.PhoneNumber.newBuilder()
.setNumber("010-34783871").setType(Person.PhoneType.MOBILE)); Person person = builder.build();
System.out.println(person.toString());
} /**
* 测试反序列化
*
* @throws InvalidProtocolBufferException
*/
@Test
public void testDeserialize() throws InvalidProtocolBufferException {
PersonProto.Person.Builder builder = PersonProto.Person.newBuilder();
builder.setAge(23);
builder.setBirthday("2016-12-23");
builder.setName("ghostman");
builder.setMan(true); Person person = builder.build();
Person newPerson = Person.parseFrom(person.toByteArray());
System.out.println(newPerson.toString());
}
}

项目结构如下图所示:

protobuf初体验

protobuf  java初体验已经结束。

参考资料如下:

https://developers.google.com/protocol-buffers/docs/javatutorial

https://github.com/google/protobuf/

http://www.cnblogs.com/ungshow/archive/2011/12/27/2303257.html

http://blog.csdn.net/caisini_vc/article/details/5599468

注:

发现一个封装了protobuf文件操作的步骤,可以直接使用java注解定义字段类型即可。github地址如下,有兴趣的可以自行研究:

https://github.com/jhunters/jprotobuf