C++|Java工作笔记-google protobuf基本使用
目录
前言
protoc生成
Java相关
C++相关
前言
这里主要是生成序列号,在我所做的项目中,一般是把数据序列化后扔到消息总线上,消费者读取了,自行解析。
个人感觉这种方式比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.proto
protoc.exe --cpp_out=./ TestProtocStruMsg.proto
这里要注意“/”后面是有个空格的。
这里就生成好了,把对应的文件拷贝到项目里面即可
Java相关
这里,在安装Windows版的protobuf就会带一个jar包,这里我们使用Maven项目,直接从网上加载,也可以手动把这个jar包导入到Maven仓库中:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>ProtocDemo</groupId><artifactId>ProtocDemo</artifactId><version>ProtocDemo</version><dependencies><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>2.5.0</version></dependency></dependencies></project>
把生成好的文件导入项目中:
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
再根据官方所说的:
./configure
make
make check
make install
这里在./configure的时候可以指定其路径:
如果没有指定,默认就会在/usr/local/lib下面。这里搞好后,就可以用了。
这里我建立的是Qt项目:
这里包含,读取Java刚刚生成的file文件,并且解析,以及使用C++把这个数据序列化。
pro文件如下:
QT += core
QT -= guiCONFIG += c++11TARGET = probuffDemo
CONFIG += console
CONFIG -= 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 <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QByteArray>
#include <iostream>
#include <string>
#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 TestProtocStruTestProtocStru *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++程序打包:https://github.com/fengfanchen/Qt/tree/master/probuffDemo
Java程序打包:https://github.com/fengfanchen/Java/tree/master/ProtocDemo
C++|Java工作笔记-google protobuf基本使用相关推荐
- java工作笔记019---java8新特性判断非null
技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 对于null的处理,可以下面这样做: Optional.ofNullable(str).orElse(new Str ...
- Java工作笔记-@Value注解的使用(可用于配置文件)
目录 基本概念 代码与实例 程序打包下载 基本概念 @Value:注入配置文件中的内容.只要是spring的注解类(service,compotent, dao等)中都可以. @Component:泛 ...
- Java工作笔记-使用Maven创建多模块项目
目录 前言 演示 前言 在某些项目中会用到多模块,一般情况下都使用Maven进行操作,然后手动写porn.xml,这样就算是spring boot也是手动写的,并没有使用官方的初始化项目工具. 演示 ...
- Java工作笔记-使用jquery.timer.js实现数据自动刷新
程序运行截图如下: 程序结构如下: 源码如下: HelloServlet.java package my;import java.io.IOException; import java.io.Prin ...
- Java工作笔记-AJAX实现整体不变,局部更新(与整体刷新比较)
old.js:整体刷新页面,才能实现数据刷新 new.js:点击刷新按钮,就可以刷新 目录结构图如下: 源码如下: HelloServlet.java package my;import java.i ...
- Java工作笔记/Java面试题/Java八股文/Java常用API
码农工具包 hutool工具 hutool工具类判断各种类型数据 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --& ...
- Java工作笔记-使用CXF接入及创建WebService
这里我采用Spring Boot进行项目启动. 关于CXF要添加的Maven: <dependency><groupId>org.apache.cxf</groupId& ...
- Java工作笔记-接入互联网的免费WebService
这里都是使用wsimport进行解析wsdl文件: 如果遇到解析wsdl问题,那么可以进行这样修改 将: <s:element ref="s:schema" />< ...
- Java工作笔记-发送SOAP协议请求
这里搭建WebService采用JDKService那种最简单的方式,在此博文中不再说明. 以前说过,调用javaw的API封包是这样的: 这里模拟下. 客户端结构如下: 源码如下: Main2.ja ...
最新文章
- 如何给iOS应用添加原生的二维码扫描功能
- js高级教程阅读笔记 第五章-引用类型(5.6)
- 服务器跑python程序_远程编写+调试服务器上的Python程序
- java执行linux命令
- 九十年代以来的文学事变与60后70后80后作家的写作之一
- 带有ActiveMQ的JMS
- LeetCode MySQL 1083. 销售分析 II
- iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
- android按钮_Android按钮
- [转载]Linux shell中的竖线(|)——管道符号
- HCL打开显示当前系统用户怎么解决_鼠标右键新建没有EXCEL 怎么解决?
- Echarts图表位置调整
- 服务器虚拟资源池,虚拟资源池
- 一文带你详解你不知道的ADL原理
- AngularJS $destroy
- 献给不知道自己该干什么的朋友—值得一看
- 40 岁的时候,我转行成为一名前端开发者!
- Flume简介及配置
- 常用小工具:一款好用、实用的“日常工作安排”桌面日历
- 程序员搞开源,读什么书最合适?