java 怎么使用protobuf库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 怎么使用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());
参考技术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库的主要内容,如果未能解决你的问题,请参考以下文章

基于nginx实现protobuf RPC

Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用

Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用

服务器更改时如何为客户端更新 protobuf 文件

尴尬的事情又发生Newtonsoft.Json vs Protobuf.net

尴尬的事情又发生Newtonsoft.Json vs Protobuf.net