`

使用java原生url连接传输protobuf

    博客分类:
  • Java
阅读更多

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

不过这个开源工具对集合没有适合的注解,而且也没有说明和其他语言传输的时候,如何保证一致性,所以需要使用的人考虑清楚,需要慎用。

分享到:
评论

相关推荐

    protobuf java自动生成,例子实用

    标题中的“protobuf java自动生成”指的是使用Google的Protocol Buffers(简称protobuf)工具在Java环境中进行数据序列化和反序列化的自动化过程。protobuf是一种高效、跨平台的数据交换格式,它能够将结构化数据...

    Java 和 protobuf 3.5开发实例一

    在本文中,我们将深入探讨如何使用Java与Protocol Buffers(protobuf)3.5版本进行开发。Protocol Buffers是Google推出的一种高效的数据序列化协议,它允许开发者定义数据结构,然后生成能够在各种数据平台之间轻松...

    java序列化之protobuf

    开发者可以使用protobuf编译器将.proto文件编译成Java、C++、Python等语言的类,这些类提供了序列化和反序列化的方法。protobuf的优势在于它产生的代码执行速度快,序列化后的数据体积小,且具有良好的版本兼容性。 ...

    Java protobuf框架使用向导ProtoBuf

    Java protobuf框架使用向导ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf

    protobuf-java-3.17.0.zip

    1. **高效性**:protobuf生成的二进制编码方式比XML或JSON更节省空间和时间,适合在网络传输和存储中使用。 2. **易用性**:通过定义.proto文件,可以清晰地描述数据结构,编译器会自动生成Java、C++、Python等多...

    eclipse 使用 protobuf-java-2.4.1.jar java

    标题中的“eclipse 使用 protobuf-java-2.4.1.jar java”表明我们将讨论如何在Eclipse集成开发环境中使用Google的Protocol Buffers(protobuf)库,具体版本为2.4.1,该库以Java类库的形式提供,即protobuf-java-...

    Protobuf3.4 java

    1. `protobuf.jar`:Java库文件,包含了 Protobuf 的Java API,开发者可以在项目中引用这个JAR来使用Protobuf功能。 2. `protoc`或`protoc.exe`:编译器,用于生成Java代码或其他语言的代码,根据操作系统可能有不同...

    protobuf-java-2.5.0jar包

    开发者可以使用protobuf编译器(protoc)将.proto文件转换为Java类,这些类提供了序列化和反序列化的API,使得程序能够轻松地处理和解析protobuf格式的数据。 使用protobuf有以下几个关键步骤: 1. 定义数据结构:...

    protobuf--java-3.2.0.jar & protoc-3.2.0-windows-x86_32.exe

    开发者在Java项目中引入这个jar包,就可以在Java程序中使用protobuf API来编码和解码protobuf消息。 使用步骤: - 定义.proto文件,其中包含protobuf消息类型和字段的定义。 - 使用protoc编译器(即将讨论的工具...

    protobuf2+java

    标题 "protobuf2+java" 指涉的是Google开源的Protocol Buffers(简称protobuf)的第二版与Java语言的结合使用。Protocol Buffers是一种高效的数据序列化协议,它允许开发者定义数据结构,然后生成能够在各种数据平台...

    protobuf-java-3.11.4-API文档-中文版.zip

    赠送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...

    protoc.exe和protobuf-java-3.6.1集合

    3. **引入protobuf库**:将protobuf-java-3.6.1.jar添加到Java项目的类路径中,以便在运行时使用protobuf的API。 4. **序列化和反序列化**:在Java代码中,使用生成的Java类实例化消息对象,填充字段,然后通过...

    java开发Google protobuf 3.2.0 jar包 protobuf-java-3.2.0.jar

    ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,...protobuf-java-3.2.0.jar包 太难找了,只能是自己发布一个jar包 特此分享出来

    protobuf-java-3.0.0.tar.gz

    “java”表示这是protobuf针对Java平台的实现,这意味着它可以被Java应用程序直接使用。“3.0”是protobuf的版本号,每个版本可能包含新功能、性能优化或向后兼容性的改变。“tar”表明这个文件是使用tar工具打包的...

    java生成protobufdemo直接运行

    本教程将指导你如何使用Java直接运行protobuf demo,生成protobuf所需的Java类,并展示如何读取和写入protobuf数据。 步骤1:安装protobuf编译器 首先,你需要下载并安装protobuf编译器 protoc。你可以访问protobuf...

    Protobuf 2.5.0 在Java中的简单使用

    Protobuf在Java中的简单使用,包括一个使用步骤文档、protoc.exe编译程序、protobuf2.5.0.jar包,和一个Java测试程序: http://blog.csdn.net/yaoyuanyylyy/article/details/36416617

    protobuf-java-3.4.0.zip

    在Java环境中,protobuf提供了编译器和API,使得开发者可以方便地在应用程序中使用protobuf定义的数据结构。 描述中的"protobuf-java-3.4.0.zip"进一步确认了这是一个针对Java平台的protobuf库的特定版本,即3.4.0...

    protobuf-java-3.0.0.jar protobuf-java-3.4.0.jar 以及对应版本的protoc.exe

    标签"protobuf-jav"和"protobuf-java"表明这是关于protobuf在Java平台上的使用,而"protoc.exe"则涉及protobuf的编译过程。这些文件通常被软件开发者用来处理和传输结构化数据,特别是在分布式系统、网络通信、数据...

    Protobuf生成java类

    - 在Java项目中,需要添加protobuf-java库作为依赖,以便使用编译器生成的Java类。 - 通过Maven或Gradle,可以很容易地将protobuf-java库引入到构建配置中。 9. **运行时支持**: - 除了编译器生成的代码,...

    protobuf2协议文件转java

    在Java开发中,使用protobuf可以将定义的数据结构转换成易于在网络上传输的二进制格式,同时也支持反序列化回原始的数据结构。 protobuf2协议文件通常以`.proto`为扩展名,里面定义了各种消息类型、服务接口以及...

Global site tag (gtag.js) - Google Analytics