浅析protobuf应用
Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统(Remote Procedure Call Protocol System)和持续数据存储系统。
其类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差,类似的还有json、Java的Serializable等。
很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
linux环境安装
1. 下载
https://github.com/google/protobuf/releases下载protobuf-all-3.5.1.tar.gz
2. 解压 tar xvf protobuf-all-3.5.1.tar.gz
3. 编译并安装
cd protobuf.3.5.1
./configure
make
make check
make install
4. 验证
protoc --version

错误及解决方法 :
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
错误原因:
protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib 不在Ubuntu体系默认的 LD_LIBRARY_PATH 里,所以就找不到该lib
解决方法:
1). 创建文件 /etc/ld.so.conf.d/libprotobuf.conf,在该文件中输入如下内容: /usr/local/lib
2). 执行命令 sudo ldconfig
安装完成!
5. 编译proto文件,生成java文件(自定义文件,有自己的格式,下文会介绍)
protoc -I=SRC_DIR --java_out=DST_DIR/SRC_DIR/addressbook.proto
使用上面的命令格式生成编译很好的Java class文件
SRC_DIR表示生成的java文件存储位置,DST_DIR/SRC_DIR/addressbook.proto,表示编译.proto文件路径
Window环境安装
1.下载protobuf
2、配置环境变量
将解压出来的protoc.exe放在一全英文路径下,并把其路径名放在windows环境变量下的path下。
3 .验证
protoc --version
4. 编译proto文件,生成java文件(与上面的执行命令都可以)
proto.exe --java_out=./ ./proto/person.proto
前面为java文件路径,后面为proto文件路径
实例应用
编辑proto文件
syntax="proto2";
option java_package = "com.protobuftest.protobuf";
option java_outer_classname = "PersonProbuf"; message Person
{
required string name = 1;
required int32 id = 2;
optional string email = 3; enum PhoneType
{
MOBILE = 0;
HOME = 1;
WORK = 2;
} message PhoneNumber
{
required string number = 1;
optional PhoneType type = 2 [default = HOME];
} repeated PhoneNumber phone = 4; message CountryInfo
{
required string name = 1;
required string code = 2;
optional int32 number = 3;
}
} message AddressBook
{
repeated Person person = 1;
}
代码解释:
syntax="proto2";表明使用protobuf的编译器版本为v2,目前最新版本为V3,规则有所改变。如果不写默认为V2
java_outer_classname表示生成的java文名:"PersonProbuf";
java_package 表示将生成的java文件放入指定的package中 "com.protobuftest.protobuf"; 没有自行创建。 import 当前proto文件导入外部proto文件
message是Protobuf中的结构化数据,表示声明一个类,即java中的class
浅析protobuf应用的更多相关文章
- protobuf 协议浅析
目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...
- netty5 HTTP协议栈浅析与实践
一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...
- 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案 本文是截止目前为止最强攻略,按照本文方法基本可以无压力应对caffe和Ross B. Girshick的 ...
- 常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)
目前业界有各种各样的网络输出传输时的序列化和反序列化方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度.对系统的影响.传输数据的大小.可维护性 ...
- drozer浅析三:命令实现与交互
前面走马观花的看了几个模块的源码,看到是用python(会加载自定义的java类)写的.产生2个问题:在命令行中输入command,drozer是如何去执行的:python是如何与java交互的. d ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
随机推荐
- oracle如何实现自增?----用序列sequence的方法来实现
将表t_user的字段ID设置为自增:(用序列sequence的方法来实现) ----创建表 Create table t_user( Id number(6),userid varchar2(2 ...
- 洛谷 P2298 【Mzc和男家丁的游戏 】
这道题还是挺水的,广搜模板题,注意一下细节就是了. :码代上上代码: #include <bits/stdc++.h> using namespace std; int n , m , s ...
- 小师妹学JVM之:cache line对代码性能的影响
目录 简介 一个奇怪的现象 两个问题的答案 CPU cache line inc 和 add 总结 简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的实战 ...
- Xshell6 优化
Xshell6 优化
- vs dll lib 使用记录
今天把学习opengl的项目从一个电脑copy到另一个电脑时候,发生了glu.dll找不到,导致项目起不来的问题.后来网上查找发现, 虽然我使用了静态连接 mt/mtd 编译, 但是有可能lib中并没 ...
- 【python接口自动化】01-requests请求
requests是模拟HTTP.https请求接口. 一.HTTP协议介绍 1.1HTTP协议特点 1.2HTTP协议组成 请求方法 主要的请求方法有:GET.POST.DELETE .PUT .HE ...
- day69 cookie与session
目录 一.forms源码解析 二.cookie与session发展史 三.cookie操作 四.session操作 五.CBV如何添加装饰器 一.forms源码解析 # from组件的切入点是is_v ...
- day17 装饰器(上)
目录 一.什么是装饰器 二.为什么要有装饰器 三.无参装饰器的使用 一.什么是装饰器 装饰:是对其他已有的事物添加额外具有一定意义的事物 器:是一种工具,在程序内可以定义成函数 合到一起就是: 装 ...
- Spring-boot 启动报错 调试小技巧
描述: 我们在启动spring-boot,spring-cloud 项目时,是不是经常 遇到报错,但是在控制台 没有能找到 具体 报错信息,只是 提示,启动失败,缺乏具体的报错信息,这样就很不方便我们 ...
- SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...