java中使用protobuf在maven项目中写一个示例

createh51个月前 (02-07)技术教程10

protobuf

前两天上课听玄姐说pb, 对于我这个菜鸡来说, 这玩意都没有听说过, 只能先补充一下基础支持了

1. protobut简介

1. protobut介绍

Protocol Buffers(简称protobuf), protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持php、java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

官方文档
http://code.google.com/p/protobuf/

2. protobuf的优缺点

Protobuf的优点如下:A、性能好,效率高: 序列化后字节占用空间比XML少3-10倍,序列化的时间效率比XML快20-100倍。B、有代码生成机制: 将对结构化数据的操作封装成一个类,便于使用。C、支持向后和向前兼容: 当客户端和服务器同时使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用D、支持多种编程语言: Protobuf目前已经支持Java,C++,Python、Go、Ruby等多种语言。

Protobuf的缺点如下:A、二进制格式导致可读性差B、缺乏自描述

2. idea安装protobuf插件

安装插件protobuf Support,之后重启

3. 配置maven依赖


? ? ? 
? ? ? ? ? com.google.protobuf
? ? ? ? ? protobuf-java
? ? ? ? ? 3.4.0
? ? ? 



? ? ? 
? ? ? ? ? 
? ? ? ? ? ? ? kr.motd.maven
? ? ? ? ? ? ? os-maven-plugin
? ? ? ? ? ? ? 1.4.1.Final
? ? ? ? ? 
? ? ? 
? ? ? 
? ? ? ? ? 
? ? ? ? ? ? ? org.xolstice.maven.plugins
? ? ? ? ? ? ? protobuf-maven-plugin
? ? ? ? ? ? ? 0.5.0
? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? ? ? com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? grpc-java
? ? ? ? ? ? ? 
? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? ? ? ? ? compile
? ? ? ? ? ? ? ? ? ? ? ? ? compile-custom
? ? ? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? ? ? 
? ? ? ? ? ? ? 
? ? ? ? ? 
? ? ? 

4. 书写proto文件

syntax?=?"proto3";
option?java_package?=?"com.jihite";
option?java_outer_classname?=?"PersonModel";

message?Person?{
? ??int32?id?=?1;
? ??string?name?=?2;
? ??string?email?=?3;
}

5. 转换成java文件

6. 测试

把生成的类考的代码路径下,用下面测试用例测试

package?com.jihite;

import?com.google.protobuf.InvalidProtocolBufferException;
import?org.junit.Test;
public?class?protobufTest?{
? ?@Test
? ?public?void?testN()?throws?InvalidProtocolBufferException?{
? ? ? ?PersonModel.Person.Builder?builder?=?PersonModel.Person.newBuilder();
? ? ? ?builder.setId(1);
? ? ? ?builder.setName("jihite");
? ? ? ?builder.setEmail("jihite@jihite.com");

? ? ? ?PersonModel.Person?person?=?builder.build();
? ? ? ?System.out.println("before:"?+?person);

? ? ? ?System.out.println("===Person Byte:");
? ? ? ?for?(byte?b?:?person.toByteArray()) {
? ? ? ? ? ?System.out.print(b);
? ? ? }
? ? ? ?System.out.println("================");

? ? ? ?byte[]?byteArray?=?person.toByteArray();
? ? ? ?PersonModel.Person?p2?=?PersonModel.Person.parseFrom(byteArray);
? ? ? ?System.out.println("after id:"?+?p2.getId());
? ? ? ?System.out.println("after name:"?+?p2.getName());
? ? ? ?System.out.println("after email:"?+?p2.getEmail());

? }
}

结果:

before:id:?1
name:?"jihite"
email:?"jihite@jihite.com"

===Person?Byte:
811861061051041051161012617106105104105116101641061051041051161014699111109================
after?id:1
after?name:jihite
after?email:jihite@jihite.com

相关文章

如何理解Java中的包机制,如何有效使用JavaDoc生成文档

包机制一般用公司域名倒置作为包名:如百度网址www.baidu.com,包命名为com.baidu.www(com.yang)包必须在类的最上面,导入包使用语句import package 包名.(是...

用Java代码写一个记事本小程序_用java编写一个记事本程序

记事本小程序简介这是个很小巧的记事本小程序,使用Java程序实现。它能实现最基本的文件打开、编辑、保存、另存为等功能,另外它附带快捷键操作功能以及鼠标右键菜单功能。运行效果图如下:源码NotePadA...

【Java】基础06:编写入门程序_java编程100例

HelloWorld它的中文意思是:“你好,世界”。仿佛代表着计算机对世界说出来的第一句话,因为它简洁实用,所以被作为入门程序广泛使用。Java程序开发三步骤:编写,编译,运行一、编写即开发人员编写J...

java如何高效地读取一个超大文件?(四种方式分析对比)

前言我最近在优化我的PDF转word的开源小工具,有时候会遇到一个问题,就是如果我的PDF文件比较大,几百兆,如何更快更节省内存的读取它。于是我分析对比了四种常见的读取文件的方式,并使用javaVis...

Java之在.java文件类中调用js方法

此场景,适用于无Html页面,纯后台调式脚本语言。首先创建一个js文件,放在resource下的静态文件下// 供java进行调用 function hello(str) { var co...

Mybatis配置文件XML全貌详解,再不懂我也没招了

一、为什么要使用配置文件试想,如果没有配置文件,我们的应用程序将只能沿着固定的姿态运行,几乎不能做任何动态的调整,那么这不是一套完美的设计,因为我们希望拥有更宽更灵活的操作空间和更多的兼容度,同时也能...