由于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());

原文地址:http://blog.csdn.net/angus_17/article/details/8020765

java中使用Protobuf的实例(Demo)的更多相关文章

  1. 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

    hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...

  2. 在 Java 中使用 protobuf

    在 Java 中使用 protobuf 从 https://github.com/google/protobuf/releases 下载编译器,并设置环境变量. 创建java项目添加protobuf- ...

  3. Java 中静态变量和实例变量区别

    Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...

  4. java中反射讲解及实例

    Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...

  5. 解析Java中静态变量与实例变量的区别

    java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量:另一种没有static修饰,为实例变量.      在语法定义上的区别:静态变量前要加static关键字,而实例 ...

  6. java中只能有一个实例的类的创建

    Java中,如果我们创建一个类,想让这个类只有一个对象,那么我们可以 1:把该类的构造方法设计为private 2:在该类中定义一个static方法,在该方法中创建对象 package test; / ...

  7. Java中静态变量与实例变量

    知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...

  8. java中的反射简单实例

    package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...

  9. java中类名.class、实例.getclass()区别

    import java.util.HashSet; import java.util.Iterator; /** * Created by GOD on 2016/1/23. * Class对象的生成 ...

随机推荐

  1. 205 Isomorphic Strings 同构字符串

    给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换最终变成 t ,则两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不能映射到同一个字 ...

  2. CROSS APPLY AND CROSS APPLY

    随着业务千奇百怪,DBA数据库设计各有不同,一对多关系存JSON或字符串逗号分隔... 今天小编给大家分享一下针对这个问题的解决办法 问题一.存储过程接受参数格式为XXX,XXX 解决办法:将字符转成 ...

  3. CF949B A Leapfrog in the Array

    思路: 最终的时候,对于位置p,若p是奇数,则该位置的元素是(p + 1) / 2:若p是偶数,需要从p开始不断地迭代寻找上一次跳跃所处的位置(p = p + n - p / 2),直到p是奇数为止. ...

  4. Wamp搭建的服务器登录的时候出现Access denied for user 'hello'@'localhost' (using password: YES)

    想用自己电脑做一个服务器,然后就选择了Wamp,本来一切顺利,可是到登录的时候却出现了问题,出现了 Access denied for user 'hello'@'localhost' (using ...

  5. 关于 Oracle 11g r2 Enterprise Manager (EM) 在windows环境无法启动的解决办法

    正确的解决办法是在安装的时候使用emca正确安装 如果已经安装过Enterprise Manager: 请用是如下命令卸载后重装 emca -deconfig dbcontrol db emca -r ...

  6. vue ---- Object的一些常用的方法

    在对象上添加新属性的几种方法: 直接附代码: 法一:Es6扩展运算符添加属性 法二:利用语法Object.assign(target, ...sources)    target目标对象.source ...

  7. glm 矩阵乘法得反过来写

  8. CentOS7 Install Consul

    Centos7 Install Consul 原文链接:http://www.cnblogs.com/caoguo/p/5959962.html 1) 环境 2) 安装 # yum install - ...

  9. 迅为IMX6开发板适用于HMI|车载电脑|工业控制|医疗仪器|智能家居 灵活进行产品开发平台

    i.MX6开发平台行业中的应用 适用于HMI.POS机.车载电脑.工业控制.轨道交通.医疗仪器.智能家居.数据终端等行业. 迅为iMX6开发板采用核心板+底板结构设计,高品质,稳定性强,可以更灵活地进 ...

  10. [转载]迅为4418开发板Qt移植移动4G模块第一部分

        本文转自迅为论坛:http://topeetboard.com   平台:iTOP-4418开发板   1.首先要配置内核,这个一步和Android系统移植3G或者4G模块是一样的.一般模块的 ...