java 怎么使用protobuf库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 怎么使用protobuf库相关的知识,希望对你有一定的参考价值。
1.到http://code.google.com/p/protobuf/downloads/list ,选择其中的win版本下载,我选择的是protoc-2.4.1-win32.zip2.下载一个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()); 参考技术A
你好,protobuf库作为数据传输,跨平台跨语言非常实用,在windows下,首先要编写.proto文件
package CMD;enum COMMAND
//登录
CMD_USER_LOGIN_REQ = 0x1000;
CMD_USER_LOGIN_RSP = 0x1001;
在cmd下 定位到protobuf的安装位置,然后编译
编译后的文件在CMD目录下,名称是Command.java
希望可以帮助到你
本回答被提问者和网友采纳QT中使用MinGW 编译的protobuf库--包含库的生成和使用
QT中使用MinGW 编译的protobuf库--包含库的生成和使用
0前言
最近要在QT中使用protobuf,于是需要编译protobuf静态库文件,导入qt使用,没想到过程非常曲折,各种报错各种坑,在网上参考了很多文章,最后终于成功了,现在将QT中使用protobuf的整个配置过程都写出来提供给大家,希望能够帮助到大家。
1准备工作
1.1 下载QT并安装
下载QT5.6.0,到D盘的QT文件夹,并且加入系统环境变量
D:QtQt5.6.0Toolsmingw492_32in;D:QtQt5.6.05.6mingw49_32in;D:QtQt5.6.0Toolsmingw492_32i686-w64-mingw32in
1.2 下载cmake3.11.0并安装
在https://cmake.org/download/中下载Cmake
安装到D:anzhuangbaocmake-3.11.0-rc1-win32-x86
加入系统环境变量
;D:anzhuangbaocmake-3.11.0-rc1-win32-x86cmake-3.11.0-rc1-win32-x86in
1.3 下载protobuf3.3.0的源码
在https://github.com/google/protobuf/releases中下载3.3.0的源码,如图所示
就是protobuf-cpp-3.3.0.zip
下载到D盘根目录,解压。
2生成protobuf库文件
2.1 CMAKE的设置与库的生成
打开cmake软件,选择编译的源为protobuf源码中的cmake文件夹,之后在D盘根目录下建立输出目录,为output330,设置为目标文件夹,如图所示。
然后点击configure按键,选择MinGW编译,默认的编译器即可,也就是QT自带的编译器,这样比较保险,如果本机还有别的MinGW版本,建议不要选,就选QT自带的编译器即可,如图所示。
点击finish按键,开始配置。配置结束后,点击Grouped和Advance
点开protobuf列表,只勾选一个MSVC_STATIC_RUNTIME,如下图所示。
点击Generate生成,如图所示。
生成结束后,我们发现output330文件夹中出现了makefile文件,如图所示。
打开cmd,进入output330文件夹,输入mingw32-make命令,开始编译源代码,如下图所示。
等待几分钟编译结束。
编译结束后,我们打开output330文件夹可以看到生成的库文件和protoc.exe。如下图所示。
如果没有生成protoc.exe,则可以到刚才https://github.com/google/protobuf/releases中下载protoc-3.3.0-win32.zip,bin文件中就是这个exe.
2.2 proto.cpp和.h的生成
在D盘根目录下新建一个文件testData.proto,后缀名为.proto,在文件中输入代码如下:
syntax = "proto3"; package config; message VoiceConfig{ int32 sample_rate = 1; int32 mic_num = 2; }
将之前生成的protoc.exe拷贝到C:windowssystem32中,并重命名为protoc330.exe,如图所示。
打开cmd,进入D盘根目录,也就是testData所在目录,输入如下命令,可在目录中生成.cpp和.h文件。
至此,库文件和源文件,头文件都生成完毕了。
3在QT中测试protobuf的使用
3.1 建立工程,配置.pro
建立QT控制台工程,导入生成的.cpp和.h文件,打开.pro文件,配置如下:
3.2 编写代码测试
在main中输入如下代码,测试结果如下图所示。
#include <QCoreApplication> #include <QDebug> #include <QString> #include <string> #include <config.pb.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); config::VoiceConfig vc; QString ipaddr="192.168.0.136"; std::string s = ipaddr.toStdString(); vc.set_sample_rate(32000); vc.set_allocated_voiceserver_address(&s); vc.set_wakeup_sensitivity(50); vc.set_bargein_sensitivity(50); vc.set_audo_outtype(1); std::string sdata=""; vc.SerializeToString(&sdata); qDebug()<<"size:"<<sdata.size(); config::VoiceConfig de; de.ParseFromString(sdata); qDebug()<<"sample_rate:"<<de.sample_rate(); qDebug()<<"address:"<<QString::fromStdString(de.voiceserver_address()); qDebug()<<"wakeup_sensitivity:"<<de.wakeup_sensitivity(); return a.exec(); }
代码中将数据结构中的两个变量赋值为7,9,做了序列化和反序列化,解析后数据打印为7,9说明protobuf在QT中使用成功!
4结语
前前后后花了四天时间才搞定QT的protobuf,中间踩了很多坑,有人说必须动态编译,还有的说要下载msys来编译,中间浪费了很多时间,以上是我亲自测试总结的方法,希望大家能用上,最后,我将已经编译好的protobuf3.3.0的库文件和protoc.exe打包上传,需要的可以直接下载使用,https://download.csdn.net/download/f1jiaziqing2/10759471 免去了编译的步骤。
以上是关于java 怎么使用protobuf库的主要内容,如果未能解决你的问题,请参考以下文章
Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用
Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用