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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月29日 08时05分06秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MyEclipse快捷键及经验总结 绝对的有用 太给力了
2019-04-30
把自己的jsp或html模板添加到myeclipse中
2019-04-30
javascript放大镜效果
2019-04-30
CLOSE_WAIT状态的原因与解决方法
2019-04-30
如何kill一个 defunct 进程
2019-04-30
du命令 实现Linux 某个文件夹下的文件按大小排序
2019-04-30
typedef struct与struct的区别
2019-04-30
[转]静态链接库LIB和动态链接库DLL的区别 创建和示例
2019-04-30
linux磁盘分区fdisk命令详解
2019-04-30
oracle sql日期比较
2019-04-30
valgrind
2019-04-30
谈谈RTP传输中的负载类型和时间戳
2019-04-30
为什么要使用RTP
2019-04-30
[转]C++中的内存管理(new、delete、内存泄漏)
2019-04-30
[转]什么时候调用构造函数和析构函数
2019-04-30
vs2008静态编译Qt4.8.6
2019-04-30
基于 Jenkins 快速搭建持续集成环境
2019-04-30