$wget https://github.com/google/protobuf/archive/v2.6.1.zip
$unzip protobuf-2.6.1.zip
$cd protobuf-2.6.1
下载自github的代码需要首先执行 $ ./autogen.sh 生成configure文件
$ ./configure
$ make
$ make check
$ make install
我使用的是centos系统
usr/local/bin
usr/local/lib,
usr/local/include
是也系统默认路径之一,所以到这一步就可以使用protobuf了
$ protoc -I=./ --cpp_out=./ test.proto
到你的test.proto文件所在目录使用命令protoc -I=./ --cpp_out=./ 生成C++版本的协议文件
一切OK的话,你回在当前目录看到.h和.cc文件
123456789101112131415161718192021
修改安装路径(非root用户需要修改安装路径):
protobuf默认安装在 /usr/local 目录
你可以修改安装目录通过 ./configure --prefix=命令
虽然我是root用户但觉得默认安装过于分散,所以统一安装在/usr/local/protobuf下
$./configure --prefix=/usr/local/protobuf
$ make
$ make check
$ make install
到此步还没有安装完毕,在/etc/profile 或者用户目录 ~/.bash_profile
添加下面内容
####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
######################################
好了,goog luck
一:环境安装
1 安装brew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2 使用brew安装protobuf
brew install protobuf
3 查看protoc版本
protoc --version
4 查看protobuf版本
brew search protobuf
二:示例
gps_data.proto
syntax = "proto3"
option java_package = "com.dongwt.proto"
message gps_data {
int64 id = 1
string terminalId = 2
string dataTime = 3
double lon = 4
double lat = 5
float speed = 6
int32 altitude = 7
int32 locType = 8
int32 gpsStatus = 9
float direction = 10
int32 satellite = 11
}
执行命令
protoc -I=src/main/resources/proto --java_out=src/main/java gps_data.proto
三:pom依赖(版本号序号protoc版本保持一致)
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.17.3</version>
</dependency>
四:单侧
public class TestGpsProtobuf {
public static void main(String[] args) {
System.out.println("===== 构建一个GPS模型开始 =====")
GpsData.gps_data.Builder gps_builder = GpsData.gps_data.newBuilder()
gps_builder.setAltitude(1)
gps_builder.setDataTime("2017-12-17 16:21:44")
gps_builder.setGpsStatus(1)
gps_builder.setLat(39.123)
gps_builder.setLon(120.112)
gps_builder.setDirection(30.2F)
gps_builder.setId(100L)
GpsData.gps_data gps_data = gps_builder.build()
System.out.println(gps_data.toString())
System.out.println("===== 构建GPS模型结束 =====")
System.out.println("===== gps Byte 开始=====")
for(byte b : gps_data.toByteArray()){
System.out.print(b)
}
System.out.println("\n" +"bytes长度" + gps_data.toByteString().size())
System.out.println("===== gps Byte 结束 =====")
System.out.println("===== 使用gps 反序列化生成对象开始 =====")
GpsData.gps_data gd =null
try {
gd = GpsData.gps_data.parseFrom(gps_data.toByteArray())
}catch (InvalidProtocolBufferException e) {
e.printStackTrace()
}
System.out.print(gd.toString())
System.out.println("===== 使用gps 反序列化生成对象结束 =====")
}
}
上篇已经简单的分析了什么是ProtoBuf协议的优缺点、简单的环境配置、项目中的简单使用和一些编写.Proto文件的注意点,下面我们更加深入一下ProtoBuf的语法及高级使用(非常感谢Carson_Ho大神的博文指导)
作用 :防止不同 .proto 项目间命名 发生冲突
ProtoBuf包的解析过程如下 :
作用 :影响 特定环境下 的处理方式,但不改变整个文件声明的含义
常用Option选项 :(因为使用有限,简单列举常见的)
作用 :真正用于描述 数据结构
在.proto消息模型中主要有 消息对象&字段
组成 :字段 = 字段修饰符 + 字段类型 +字段名 +标识号(主要针对proto2以前版本)
字段 = 字段类型 +字段名 +标识号(主要针对proto3及以后版本)
一个消息对象 可以将 其他消息对象类型 用作字段类型
关于ProtoBuf在项目中的实践的高级用法请关注:下一篇博客:在项目中使用Protobuf协议实现数据传输(三)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)