java中使用Protobuf的实例(Demo)
由于Protobuf受到推崇,故尝试采用protobuf来摒弃传统的xml进行传输数据。
首先,需要下载的关于Protobuf的文件:
option java_package = "com.sq.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
required int32 ID = 1;
required string Url = 2;
}
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)的更多相关文章
- 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo
hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...
- 在 Java 中使用 protobuf
在 Java 中使用 protobuf 从 https://github.com/google/protobuf/releases 下载编译器,并设置环境变量. 创建java项目添加protobuf- ...
- Java 中静态变量和实例变量区别
Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...
- java中反射讲解及实例
Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...
- 解析Java中静态变量与实例变量的区别
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量:另一种没有static修饰,为实例变量. 在语法定义上的区别:静态变量前要加static关键字,而实例 ...
- java中只能有一个实例的类的创建
Java中,如果我们创建一个类,想让这个类只有一个对象,那么我们可以 1:把该类的构造方法设计为private 2:在该类中定义一个static方法,在该方法中创建对象 package test; / ...
- Java中静态变量与实例变量
知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...
- java中的反射简单实例
package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...
- java中类名.class、实例.getclass()区别
import java.util.HashSet; import java.util.Iterator; /** * Created by GOD on 2016/1/23. * Class对象的生成 ...
随机推荐
- 转 ORA-12638: 身份证明检索失败
ORA-12638: 身份证明检索失败 的解决办法 2008年06月25日 星期三 11:42 the NTS option makes the Oracle client attempt to us ...
- hihocoder offer收割编程练习赛11 C 岛屿3
思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x ...
- iOS Programming Localization 本地化
iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...
- 阿里云ecs绑定域名
在阿里云服务器ECS一切配置ok后,通过域名一直访问不成功,结果发现还需要在后台进行安全组的规则设定:
- iOS-UI控件之UIButton
---恢复内容开始--- UIButton 既可以显示图片,又可以显示文字,还能随时调整内部位置 系统自带尺寸 storyboard内部调整UIButton属性 状态 监听按钮点击事件 凡是继承自UI ...
- 框架开发之Java注解的妙用
注解的好处:1.能够读懂别人写的代码,特别是框架相关的代码.2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰.3.(重点 ...
- 使用JDBC创建出版社和书籍管理系统
1.需求 已知如下两个表: publisher id name(唯一) address book id isbn name publisher_id 欢迎进入书籍管理系统 1.出版社管理:增.删(na ...
- OracleService類
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...
- 使用cmd查看Tensorboard的生成图
代码中"graph_practice7/"文件存放的是生成的神经网络图 现在要查看这个图,使用cmd 进入文件指定目录(我的文件存储地址是E:\workspace\PycharmP ...
- cesium primitive方式 ————http://blog.sina.com.cn/s/blog_15e866bbe0102y0ji.html
Cesium学习笔记-工具篇17-PrimitivePoint自定义渲染-点 (2018-08-28 16:12:06) 转载▼ 标签: cesium primitive 自定义渲染 shader c ...