目录

前言

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基本使用相关推荐

  1. java工作笔记019---java8新特性判断非null

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 对于null的处理,可以下面这样做: Optional.ofNullable(str).orElse(new Str ...

  2. Java工作笔记-@Value注解的使用(可用于配置文件)

    目录 基本概念 代码与实例 程序打包下载 基本概念 @Value:注入配置文件中的内容.只要是spring的注解类(service,compotent, dao等)中都可以. @Component:泛 ...

  3. Java工作笔记-使用Maven创建多模块项目

    目录 前言 演示 前言 在某些项目中会用到多模块,一般情况下都使用Maven进行操作,然后手动写porn.xml,这样就算是spring boot也是手动写的,并没有使用官方的初始化项目工具. 演示 ...

  4. Java工作笔记-使用jquery.timer.js实现数据自动刷新

    程序运行截图如下: 程序结构如下: 源码如下: HelloServlet.java package my;import java.io.IOException; import java.io.Prin ...

  5. Java工作笔记-AJAX实现整体不变,局部更新(与整体刷新比较)

    old.js:整体刷新页面,才能实现数据刷新 new.js:点击刷新按钮,就可以刷新 目录结构图如下: 源码如下: HelloServlet.java package my;import java.i ...

  6. Java工作笔记/Java面试题/Java八股文/Java常用API

    码农工具包 hutool工具 hutool工具类判断各种类型数据 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --& ...

  7. Java工作笔记-使用CXF接入及创建WebService

    这里我采用Spring Boot进行项目启动. 关于CXF要添加的Maven: <dependency><groupId>org.apache.cxf</groupId& ...

  8. Java工作笔记-接入互联网的免费WebService

    这里都是使用wsimport进行解析wsdl文件: 如果遇到解析wsdl问题,那么可以进行这样修改 将: <s:element ref="s:schema" />< ...

  9. Java工作笔记-发送SOAP协议请求

    这里搭建WebService采用JDKService那种最简单的方式,在此博文中不再说明. 以前说过,调用javaw的API封包是这样的: 这里模拟下. 客户端结构如下: 源码如下: Main2.ja ...

最新文章

  1. 如何给iOS应用添加原生的二维码扫描功能
  2. js高级教程阅读笔记 第五章-引用类型(5.6)
  3. 服务器跑python程序_远程编写+调试服务器上的Python程序
  4. java执行linux命令
  5. 九十年代以来的文学事变与60后70后80后作家的写作之一
  6. 带有ActiveMQ的JMS
  7. LeetCode MySQL 1083. 销售分析 II
  8. iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
  9. android按钮_Android按钮
  10. [转载]Linux shell中的竖线(|)——管道符号
  11. HCL打开显示当前系统用户怎么解决_鼠标右键新建没有EXCEL 怎么解决?
  12. Echarts图表位置调整
  13. 服务器虚拟资源池,虚拟资源池
  14. 一文带你详解你不知道的ADL原理
  15. AngularJS $destroy
  16. 献给不知道自己该干什么的朋友—值得一看
  17. 40 岁的时候,我转行成为一名前端开发者!
  18. Flume简介及配置
  19. 常用小工具:一款好用、实用的“日常工作安排”桌面日历
  20. 程序员搞开源,读什么书最合适?

热门文章

  1. 线程学习3——前台线程和后台线程
  2. CCNA学习与实验指南(640-802)
  3. Aix vmstat命令解析
  4. 转 Procrastination
  5. 解决Vista文件操作缓慢问题:五大方案
  6. 用 Git 操作的数据库?这个项目火了!
  7. 从72小时到1分钟,数据如何快速响应业务需求?
  8. 彭文华:详解数字化转型的破局之道(附直播视频)
  9. 为什么说RESTful对程序员如此重要
  10. 【转载】几个比较靠谱的即时通讯软件