C++|Java工作笔记-google protobuf基本使用
发布日期:2021-06-30 10:40:46 浏览次数:2 分类:技术文章

本文共 4178 字,大约阅读时间需要 13 分钟。

目录

 

 


 

 

前言

这里主要是生成序列号,在我所做的项目中,一般是把数据序列化后扔到消息总线上,消费者读取了,自行解析。

个人感觉这种方式比Json和XML都方便,从数据大小来看,也比Json及XML小得多。

本次使用的protoc版本为2.5.0

 

protoc生成

通过编写proto文件,让protoc生成对应的java或cc,h文件:

如下的proto文件:

message TestProtocStru{	required string value1 = 1;	required int32 value2 = 2;	required bool value3 = 3;}

通过如下命令,生成cc,h以及java

protoc.exe --java_out=./ TestProtocStruMsg.protoprotoc.exe --cpp_out=./ TestProtocStruMsg.proto

这里要注意“/”后面是有个空格的。

这里就生成好了,把对应的文件拷贝到项目里面即可

 

Java相关

这里,在安装Windows版的protobuf就会带一个jar包,这里我们使用Maven项目,直接从网上加载,也可以手动把这个jar包导入到Maven仓库中:

4.0.0
ProtocDemo
ProtocDemo
ProtocDemo
com.google.protobuf
protobuf-java
2.5.0

把生成好的文件导入项目中:

Main里面包括Java生成protobuf类,以及解析protobuf类:

package protoc;import protoc.object.TestProtocStruMsg;import java.io.*;public class Main {    public static void main(String[] args) throws IOException {        TestProtocStruMsg.TestProtocStru.Builder stru = TestProtocStruMsg.TestProtocStru.newBuilder();        stru.setValue1("Hello world");        stru.setValue2(10086);        stru.setValue3(true);        TestProtocStruMsg.TestProtocStru struMsg = stru.build();        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();        struMsg.writeTo(outputStream);        //存起来,给C++解析        byte[] byteArray = outputStream.toByteArray();        File file = new File("file");        if(file.exists()){            if(!file.delete()){                System.out.println("have file, delete failed");                return;            }        }        if(!file.createNewFile()){            System.out.println("create file failed!");            return;        }        FileWriter fileWriter = new FileWriter(file.getAbsoluteFile(), true);        for(int i = 0; i < byteArray.length; i++) {            fileWriter.write(byteArray[i]);        }        fileWriter.close();        //存完啦        //Java直接解析,C++等会再看        ByteArrayInputStream input = new ByteArrayInputStream(byteArray);        TestProtocStruMsg.TestProtocStru test = TestProtocStruMsg.TestProtocStru.parseFrom(input);        System.out.println("value1: " + test.getValue1());        System.out.println("value2: " + test.getValue2());        System.out.println("value3: " + test.getValue3());    }}

这里会生成一个file文件:

这个文件等会会拿给C++使用。

 

 

C++相关

这里把protobuf-2.5.0.tar.gz

再根据官方所说的:

./configuremakemake checkmake install

这里在./configure的时候可以指定其路径:

如果没有指定,默认就会在/usr/local/lib下面。这里搞好后,就可以用了。

这里我建立的是Qt项目:

这里包含,读取Java刚刚生成的file文件,并且解析,以及使用C++把这个数据序列化。

pro文件如下:

QT += coreQT -= guiCONFIG += c++11TARGET = probuffDemoCONFIG += consoleCONFIG -= app_bundleTEMPLATE = appSOURCES += main.cpp \    TestProtocStruMsg.pb.ccDEFINES += QT_DEPRECATED_WARNINGSLIBS += -L/usr/local/lib -lprotobuf -lprotobuf-lite -lprotocHEADERS += \    TestProtocStruMsg.pb.h

main.cpp如下:

#include 
#include
#include
#include
#include
#include
#include "TestProtocStruMsg.pb.h"using namespace std;int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QFile file("/XXX/XXX/XXX/probuffDemo/file"); if(!file.open(QIODevice::ReadOnly)){ qDebug() << "open failed!"; return 0; } QByteArray arr = file.readAll(); qDebug() << arr; file.close(); TestProtocStru test ; if(!test.ParseFromArray(arr.data(), arr.length())){ qDebug() << "parse failed"; return 0; } qDebug() << test.value1().c_str(); qDebug() << test.value2(); qDebug() << test.value3(); //create TestProtocStru TestProtocStru *testStru = new TestProtocStru(); testStru->set_value1("hehehe"); testStru->set_value2(10010); testStru->set_value3(true); string s; if(!testStru->SerializeToString(&s)){ qDebug() << "SerializeToString failed!"; return 0; } qDebug() << "-------------------------------------------------"; TestProtocStru test2 ; if(!test2.ParseFromArray(s.c_str(), s.length())){ qDebug() << "parse failed"; return 0; } qDebug() << test2.value1().c_str(); qDebug() << test2.value2(); qDebug() << test2.value3(); return a.exec();}

程序运行截图如下:

 

 

下面给出两个小程序的下载地址:

C++程序打包:

Java程序打包:

转载地址:https://it1995.blog.csdn.net/article/details/103214294 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++|Qt笔记-CS1.6作弊器编写(无限子弹、无限手雷、血、防弹衣、压枪等)
下一篇:Java|C++工作笔记-控制台带参数运行程序

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月29日 08时05分06秒