zoukankan      html  css  js  c++  java
  • java中使用Protobuf的实例(Demo)

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



        </div>
    

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

  • 相关阅读:
    【iOS】去掉Tabbar顶部线条
    iOS中控制器的释放问题
    码云平台帮助文档_V1.2
    iOS键盘 样式/风格
    cocoapods的安装 升级版
    Unity异常捕获
    tomcat和jdk的安装配置
    Unity读取Excel表格
    NFS
    K8S存储相关yaml
  • 原文地址:https://www.cnblogs.com/jpfss/p/10881357.html
Copyright © 2011-2022 走看看