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

createh53个月前 (02-07)技术教程15

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实现文件上传和下载的方法详解

Java实现文件上传和下载的方法详解,Java实现文件上传和下载解决方案,Java实现文件上传和下载思路,Java实现文件上传和下载源码,Java实现文件上传和下载实例,Java实现文件分块上传和下载...

java超简单系列课程——使用记事本写一个java程序

下一个知识点来讲如何使用记事本来开发一个java程序。先分为几个步骤。·第一个步骤先是编码过程。·第二个步骤要经过编译。编译就是把写的java代码,程序员能看懂的java代码翻译成电脑系统能够看懂的j...

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

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

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

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

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

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

Java文件上传与下载_java文件上传下载项目

1 文件上传1.1 文件上传入门1.1.1 实现文件上传条件1)表单的提交方式必须是POST方式。(才有content-type属性)2)有文件上传表单,表单中有的选择文件的标签3)把表单设置为enc...