java中使用Protobuf的实例(Demo)

转载 2016年05月30日 15:08:02

由于Protobuf受到推崇,故尝试采用protobuf来摒弃传统的xml进行传输数据。


首先,需要下载的关于Protobuf的文件:

1.到http://code.google.com/p/protobuf/downloads/list ,选择其中的win版本下载,我选择的是protoc-2.4.1-win32.zip

2.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同)

然后就开始开发了。

步骤:
1.用记事本编写一个.proto文件:
}如:我编写的是test.proto 

package protobuf; 
option java_package = "com.sq.protobuf"; 
option java_outer_classname = "FirstProtobuf"; 
message testBuf  { 
  required int32 ID = 1; 
  required string Url = 2; 
}

将其放在与刚解压的protoc.exe同级目录中。

2.
在cmd中,到protoc-2.4.1-win32文件夹下,
执行
E:\protoc-2.4.1-win32> protoc.exe --java_out=./ test.proto 
则可以找到的一个生成的FirstProtobuf.java文件。


3.

在MyEclipse中新建一个java project,建立包com.sq.protobuf,然后将刚才生成的FirstProtobuf.java文件放在其下面。

此时会报错,因为没有引入jar包,在package视图下,将protobuf-java-2.4.1.jar引入,即可解决问题。


4.

建立测试文件:


package com.sq.protobuf.test; 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.sql.Blob; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import com.google.protobuf.InvalidProtocolBufferException; 
import com.sq.protobuf.FirstProtobuf; 

public class Test { 
public static void main(String[] args) { 

//序列化过程 
//FirstProtobuf是生成类的名字,即proto文件中的java_outer_classname 
//testBuf是里面某个序列的名字,即proto文件中的message testBuf 
FirstProtobuf.testBuf.Builder builder=FirstProtobuf.testBuf.newBuilder(); 
builder.setID(777); 
builder.setUrl("shiqi"); 

//testBuf 
FirstProtobuf.testBuf info=builder.build(); 

byte[] result = info.toByteArray() ; 

String driver = "oracle.jdbc.driver.OracleDriver"; 
        String url = "jdbc:oracle:thin:@10.64.59.12:1521/orcl"; 
        String user = "parkingsystem";  
        String password = "parkingsystem"; 
        try { 
         Class.forName(driver); 
        Connection conn = DriverManager.getConnection(url, user, password); 

        if(!conn.isClosed()){ 
         System.out.println("Succeeded connecting to the Database!"); 
           
         //此处只能使用prepareStatement 
         PreparedStatement ps = conn.prepareStatement("insert into test(id,test) values (1,?)"); 
         
         //写入数据库,要把它改写为流的形式 
         ByteArrayInputStream stream =  new ByteArrayInputStream(result); 
         ps.setBinaryStream(1,stream,stream.available()); 
         Statement statement = conn.createStatement(); 
           
         Blob blob = null; 
         ps.execute(); 
         
         ////////////////上述完成将写入数据库的操作,数据库中对应的字段的属性要设置为Blob          
         
         String sql = "select test from test"; 
         ResultSet rs = statement.executeQuery(sql); 
         if(rs.next()){ 
         blob = rs.getBlob("test"); 
         } 
           
         byte[] s = blob.getBytes(1,(int)blob.length()); 
           
         FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(s); 
         System.out.println(testBuf); 
         conn.close(); 
        } 
         }catch(Exception e) { 
          e.printStackTrace(); 
         } 

//反序列化过程 
try { 
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result); 
System.out.println(testBuf); 
} catch (InvalidProtocolBufferException e) { 
e.printStackTrace(); 





发现可以将其序列化,插入到数据库,并可以从数据库出取出后,反序列化,内容可以正常显示出来。


注意的就是2点:

1.不能用statement,否则无法插入blob类型的数据

2.为参数赋值时,要用

ByteArrayInputStream stream =  new ByteArrayInputStream(result); 
ps.setBinaryStream(1,stream,stream.available()); 

java中使用Protobuf的实例(Demo)

由于Protobuf受到推崇,故尝试采用protobuf来摒弃传统的xml进行传输数据。 首先,需要下载的关于Protobuf的文件: 1.到http://code.google.co...
  • u010034351
  • u010034351
  • 2013年12月13日 12:00
  • 563

Protobuf在java项目中的使用

Protobuf在java项目中的使用 protobuf的介绍和安装这里就不多说了,不太清楚的可以参考我的上一篇博文()。这里我们就基于java的项目,引入并使用protobuf来处理数据。 资源以及...
  • cb2474600377
  • cb2474600377
  • 2015年10月30日 15:02
  • 4162

优秀的protobuf实例

关于protobuf,首先它是一个牛X的东西,谷歌推出的开源项目。它的作用是传递序列化数据用的。我们知道,在网络上或本地用于序列化的地方,大家可以用xml或json。 那protobuf的直接优点是:...
  • feixue1232
  • feixue1232
  • 2015年09月29日 19:29
  • 2585

Protobuf3 系列一 第一个Java demo

概念 Protocol buffers are a flexible, efficient, automated mechanism for serializing structured da...
  • hry2015
  • hry2015
  • 2017年04月20日 19:57
  • 1012

关于socket通信使用Protobuf

protobuf的简单说明:-protobuf 即 google protocol buffer 是一种数据封装格式协议;protobuf与其他数据格式对比优势是效率高,存储小,使用方便。如何使用:-...
  • qq_25519333
  • qq_25519333
  • 2017年06月05日 15:54
  • 222

Protobuf协议的Java应用例子

Protobuf协议,全称:Protocol Buffer 它跟JSON,XML一样,是一个规定好的数据传播格式。不过,它的序列化和反序列化的效率太变态了…… 来看看几张图你就知道它有多变态。 ...
  • antgan
  • antgan
  • 2016年08月03日 15:20
  • 25011

Protobuf 之java使用篇

碰巧用到Proto,算是笔记吧算是笔记吧, windows : 1,两个文件:proto.exe,  protobuf-Java-2.4.1.jar 2,建立一个工程TestPb,在下面建立一个...
  • baidu_18607183
  • baidu_18607183
  • 2016年06月17日 14:19
  • 1774

protobuf-实践篇

前面两篇文章介绍了 protobuf 的概念用途以及 protobuf 编译器的安装。本章我来写一个简单的例子实践一下 protobuf 。我们知道 protobuf 支持 Java、c++、Pyth...
  • huangjijie123456
  • huangjijie123456
  • 2015年10月25日 22:36
  • 559

Protobuf C++ 简单例子

1、protobuf 定义的消息文件 enum TestType  {     Enum1  = 1;       Enum2  = 2;       Enum3 = 3...
  • u010542395
  • u010542395
  • 2016年12月24日 11:55
  • 3078

protobuf二:第一个c++示例

protobuf二:第一个c++示例   2012-07-15 18:06:06|  分类: 网络编程|举报|字号 订阅      ...
  • boshuzhang
  • boshuzhang
  • 2016年10月14日 16:01
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中使用Protobuf的实例(Demo)
举报原因:
原因补充:

(最多只允许输入30个字)