Java数据通讯中使用Google Protobuf 序列化与反序列化

概念

1.什么是protocol buffer

ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

l  Google定义的一种序列化的协议格式;

l  Google内部几乎所有的RPC调用及文件格式;

(据称当前google已经定义了12,183个.proto文件,共有48,162种不同的message类型。它们用于RPC系统或各种存储系统中进行数据的存储)

l  目标:

Ø  简单性

Ø  兼容性

Ø  高性能

1. google官方连接地址  http://code.google.com/p/protobuf/downloads/list

 

2. 选择proto.exe压缩包protoc-2.4-win32.zip和protobuf-java-2.4.1.jar压缩包protobuf-2.4.zip

 

3.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同,否则可能出现编译通不过现象)

 

4.在proto.exe同级目录,编写一个netbean.proto文件,为需要序列化的数据接口加入一个message属性,为每一个字段指定名称和类型,如下所示(message 的名称不能与java_outer_classname 名称相同,不然编译不过 ):

package com.leehongee.netserver.net.bean;

 

option java_package = "com.leehongee.netserver.net.bean";

option java_outer_classname = "Request";

 

message request_Net {

 required string cmd = 1;

 optional int32 keycode = 2;      

 optional sint32 posX = 3;

 optional sint32 posY = 4;

 optional bool onOrOff = 5;

 optional bool ontouch = 6;

}

 

备注:限定修饰符 required ,optional ,repeated

required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。

optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。

repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。

 

5.使用CMD命令编译这个netbean.proto文件:

D:\protoc-2.4.1-win32>protoc.exe  --java_out=./  netbean.proto

 

6.在目录com\leehongee\netserver\net\bean 目录下将生成一个Request.java源文件,并将其引入到Myeclipse中

 

7.把jar包protobuf-java-2.4.1.jar也引入到工程libs目录中

 

8.使用方法调用序列化:

 

Request .request_Net .Builder builder=Request .request_Net ..newBuilder();

builder.setCmd("ontouch");

Request .request_Net  request=builder.builder();

byte[] buffer=request.toByteAarray();

 

9.使用反序列化:

try{

    Request .request_Net  request     = Request .request_Net .parseFrom(buffer);

   }

   catch(Exception ex){

       System.out.println(ex.getMessage());

   }


编写 一个test.proto文件

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. option java_package = "com.proto";   
  2. option java_outer_classname = "FirstProtobuf";   
  3. message TestBuf  {   
  4.   required int32 ID = 1;   
  5.   required string Url = 2;   
  6. }  

利用protoc.exe 生成java文件:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. protoc.exe --java_out=./ test.proto  

写个测试类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.test;  
  2.   
  3. import java.io.IOException;  
  4. import com.proto.FirstProtobuf;  
  5. import com.proto.FirstProtobuf.TestBuf;  
  6.   
  7. public class TestProtoBuf {  
  8.   
  9.     public static void main(String[] args) throws IOException {  
  10.         //序列化过程   
  11.         //FirstProtobuf是生成类的名字,即proto文件中的java_outer_classname   
  12.         //testBuf是里面某个序列的名字,即proto文件中的message testBuf   
  13.           
  14.         FirstProtobuf.TestBuf.Builder builder = FirstProtobuf.TestBuf.newBuilder();  
  15.           
  16.         builder.setID( 123 );  
  17.         builder.setUrl("http://www.21cn.com");  
  18.           
  19.         TestBuf info = builder.build();  
  20.         byte[] buf = info.toByteArray();  
  21.           
  22.         TestBuf tb = TestBuf.parseFrom(buf);  
  23.         System.out.println( tb.getID());  
  24.         System.out.println( tb.getUrl());  
  25.     }  
  26. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ProtoBuf是一种数据序列序列的技术,它的全称是Protocol Buffers。ProtoBuf可以将结构数据转换为二进制格式,以便在不同的系统之间进行高效的数据交换。使用ProtoBuf进行序列序列有以下几个优势: 1. 空间效率:ProtoBuf使用紧凑的二进制编码格式,可以大大减少数据的存储空间。相比于传统的文本格式如XML和JSON,ProtoBuf数据大小通常要小得多。 2. 时间效率:ProtoBuf的解析和生成代码都是使用高效的机器生成,因此在序列序列过程可以获得更快的速度。特别是在处理大规模数据时,ProtoBuf的效率更加显著。 3. 可读性:虽然ProtoBuf数据是以二进制形式存储的,但是它的定义文件是以文本形式进行编写的,具有良好的可读性和可维护性。开发人员可以通过阅读ProtoBuf定义文件了解数据结构的字段和类型。 在前后端交互ProtoBuf可以作为一种通用的数据交换格式。前端可以将数据序列ProtoBuf格式,然后发送给后端进行处理。后端可以将接收到的ProtoBuf数据序列为对象,然后进行相应的业务逻辑处理。 下面是使用ProtoBuf进行序列序列的示例代码: ```java // 创建一个user对象 User user = User.builder().id("1").age(20).name("张三").desc("programmer").build(); // 创建一个Group对象,将user放入group Group group = Group.builder().id("1").name("分组1").user(user).build(); // 使用ProtostuffUtils序列 byte[] data = ProtostuffUtils.serialize(group); System.out.println("序列后:" + Arrays.toString(data)); // 使用ProtostuffUtils序列 Group result = ProtostuffUtils.deserialize(data, Group.class); System.out.println("序列后:" + result.toString()); ``` 在上述代码,首先创建了一个User对象和一个Group对象,然后使用ProtostuffUtils对Group对象进行序列,将其转换为字节数组。接着使用ProtostuffUtils对字节数组进行序列,将其转换为Group对象。最后输出序列后的Group对象。 引用:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值