protobuf已经出来好多年了,原谅我最近才了解到google这个高性能的用于传输的格式。
从各方面来看,它无论从序列化的性能还是从序列化的压缩比都是优于当前各种传输格式的。如json、xml、hessian,java原生的Serializable。具体对比结果参见:http://agapple.iteye.com/blog/859052
网上也看了些资料,并有所了解,看了下,这玩意儿性能上来说真的没什么可说,但初始化和使用的时候感觉不是特别方便。而且网上的例子多数都是序列化过程,没有很多关于演示网络传输的demo,于是自己简单写了一个,将完整的例子摆在这里。
先定义一个Person.proto
option java_package = "com.example.protobuf"; option java_outer_classname = "PersonProbuf"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; repeated PhoneNumber phone = 4; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } }
使用protoc生成对应的PersonProtobuf类
protoc.exe Person.proto --java_out=.
请求客户端代码如下:
PersonProbuf.Person.Builder personRequest = PersonProbuf.Person.newBuilder(); personRequest.setId(1); personRequest.setName("jesse"); personRequest.setEmail("xx@xx.com"); personRequest.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("1234567890").setType(PersonProbuf.Person.PhoneType.HOME)); //使用java原生URL连接代码生成请求并获得返回值打印 URL url = new URL("http://localhost:90/protobuf.jsp"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); personRequest.build().writeTo(connection.getOutputStream()); PersonProbuf.Person personResponse = PersonProbuf.Person.parseFrom(connection.getInputStream()); System.out.println(personResponse.getId()); System.out.println(personResponse.getName()); System.out.println(personResponse.getEmail()); System.out.println(personResponse.getPhone(0)); System.out.println(personResponse.getPhone(1));
服务端protobuf.jsp代码如下:
<%@ page pageEncoding="UTF-8"%> <%@page import="com.example.protobuf.PersonProbuf"%> <% PersonProbuf.Person person = PersonProbuf.Person.parseFrom(request.getInputStream()); System.out.println(person.getId()); System.out.println(person.getName()); System.out.println(person.getEmail()); System.out.println(person.getPhone(0)); PersonProbuf.Person.Builder personBuilder = person.newBuilder(person); personBuilder.setId(2); personBuilder.setName("tiger"); personBuilder.setEmail("yy@yy.com"); personBuilder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().setNumber("0987654321").setType(PersonProbuf.Person.PhoneType.HOME)); personBuilder.build().writeTo(response.getOutputStream()); %>
执行客户端代码后,服务端/客户端输出:
------服务端输出------ 1 jesse xx@xx.com number: "1234567890" type: HOME ------客户端输出------ 2 tiger yy@yy.com number: "1234567890" type: HOME number: "0987654321" type: MOBILE
所以protobuf只是一种序列化的格式,并不是传输协议,需要传输的,只要使用输入输出流,就可以做任何保存,传输的操作。
另外百度写了个jprotobuf开源,使用起来挺方便,只要使用注解放在javabean上就可以了
github:https://github.com/jhunters/jprotobuf
不过这个开源工具对集合没有适合的注解,而且也没有说明和其他语言传输的时候,如何保证一致性,所以需要使用的人考虑清楚,需要慎用。
相关推荐
Java protobuf框架使用向导ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf
protobuf-java完整包(jar+source+javadoc+本地编译器),难得资源,直接导入可用! 使用教程: 1. 编辑build.bat,根据build.bat内设置的路径,把.proto文件放到相应的文件夹内,执行build.bat即可把.proto文件编译...
赠送jar包:protobuf-java-3.11.4.jar; 赠送原API文档:protobuf-java-3.11.4-javadoc.jar; 赠送源代码:protobuf-java-3.11.4-sources.jar; 赠送Maven依赖信息文件:protobuf-java-3.11.4.pom; 包含翻译后的API...
protobuf java代码生成,protobuf java代码生成,protobuf java代码生成,protobuf java代码生成
在使用netty进行网络通信协议传输使用protobuf时protobuf编译.proto文件生成JAVA类.zip 包括测试proto3.proto文件,自动protobuf编译.proto文件生成JAVA类
protobuf-java-3.2.0.jar
如何使用Java 和 protobuf 3.5进行开发,重点写了使用方法以及注意事项。
赠送jar包:protobuf-java-3.7.1.jar; 赠送原API文档:protobuf-java-3.7.1-javadoc.jar; 赠送源代码:protobuf-java-3.7.1-sources.jar; 赠送Maven依赖信息文件:protobuf-java-3.7.1.pom; 包含翻译后的API文档...
自己maven编译生成的,最新版,亲测可以用。 已经用在项目中了。
Protobuf在Java中的简单使用,包括一个使用步骤文档、protoc.exe编译程序、protobuf2.5.0.jar包,和一个Java测试程序: http://blog.csdn.net/yaoyuanyylyy/article/details/36416617
ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,...protobuf-java-3.2.0.jar包 太难找了,只能是自己发布一个jar包 特此分享出来
定义protobuf文件(包含enum,message,required,optional,repeated, 结构体定义中引用另一个结构体), 生成java文件,能够构建java对象,并转化为字节byte或者流,能够将流或字节转化为对象
protobuf-java-2.4.1.jar
protobuf java自动生成,例子实用
protobuf-java-3.1.0.jar
protobuf 3.5.1 的jar文件及maven-3 和protoc.exe protobuf 3.5.1 的jar文件及maven-3 和protoc.exe protobuf 3.5.1 的jar文件及maven-3 和protoc.exe
赠送jar包:protobuf-java-util-shaded-351-0.9.jar; 赠送原API文档:protobuf-java-util-shaded-351-0.9-javadoc.jar; 赠送源代码:protobuf-java-util-shaded-351-0.9-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:protobuf-java-3.16.1.jar; 赠送原API文档:protobuf-java-3.16.1-javadoc.jar; 赠送源代码:protobuf-java-3.16.1-sources.jar; 赠送Maven依赖信息文件:protobuf-java-3.16.1.pom; 包含翻译后的API...
适用于protobuf3协议规则转换为java文件的一个工具类,操作简便,谷歌下载不易。
Unity与Java使用ProtoBuf通信的Demo 代码可以直接使用