赞
踩
相关文章:Gson和Fastjson的使用
最新 文章连接,本文不再同步
性能
使用
使用范围:跨平台、跨语言(支持Java, Python, Objective-C, C+, Dart, Go, Ruby,
and C#等),可扩展性好
protoc 是编译
*.proto
为相应语言的工具
sudo apt-get install protoc
安装./configure && make
sudo ldconfig
sudo make install
protoc --version
验证是否安装成功protobuf-gradle-plugin官方介绍:https://github.com/google/protobuf-gradle-plugin
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
修改app目录下build.gradle
apply plugin: 'com.android.application'
后加上apply plugin: 'com.google.protobuf'
然后加入protobuf配置(与android{}同级)
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.builtins { remove java } task.plugins { javalite { } } } } }
最后dependencies下加入implementation 'com.google.protobuf:protobuf-lite:3.+'
安装protobuf support编辑插件,新建test.proto
文件并编辑,
内容参考test.proto
AS编译后生成文件在app/build/generated/source/proto/debug/javalite
目录下,
包名同test.proto
中定义的java_package,
类文件名同test.proto
中定义的java_outer_classname
命令行编译:protoc -I=./ --java_out=./ test.proto
,在当前目录生成同上的文件
详细工程代码参考https://gitee.com/chenjim/ProtoBuf/tree/master/ProtobufAS
参见源码MainActivity.java 中函数protoTest()
相对FastJson和Gson的对比参考代码同上,结果如下
E/MainActivity: protobuf 序列化耗时:4
E/MainActivity: protobuf 序列化数据大小:38
E/MainActivity: protobuf 反序列化耗时:2
E/JsonTest: FastJson 序列化耗时:13
E/JsonTest: FastJson 序列化数据大小:119
E/JsonTest: FastJson 反序列化耗时:16
E/JsonTest: Gson 序列化耗时:14
E/JsonTest: Gson 序列化数据大小:119
E/JsonTest: Gson 反序列化耗时:1
对于不同数据类型 采用不同的 序列化方式(编码方式 & 数据存储方式)
Tag = (field_number << 3) | wire_type
wire_type 的值参考4.2,field_number就是字段标识号,详细如下代码
//wire_type=0, field_number=1
//Tag = (field_number << 3) | wire_type
// TAG=8
required int32 id1 = 1;
//wire_type=0, field_number=2
//Tag = (field_number << 3) | wire_type
// TAG=16
required int32 id2 = 2;
可参考源码CodedOutputStream.java
中1724行函数 writeUInt32NoTag
尽量使用多用 optional或 repeated修饰符
因为若optional 或 repeated 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不需要进行编码
字段标识号(Field_Number)尽量只使用 1-15,且不要跳动使用
因为Tag里的Field_Number是需要占字节空间的。如果Field_Number>16时,Field_Number的编码就会占用2个字节,那么Tag在编码时也就会占用更多的字节;如果将字段标识号定义为连续递增的数值,将获得更好的编码和解码性能
若需要使用的字段值出现负数,请使用 sint32 / sint64,不要使用int32 / int64
因为采用sint32 / sint64数据类型表示负数时,会先采用Zigzag编码再采用Varint编码,从而更加有效压缩数据
对于repeated字段,尽量增加packed=true修饰
因为加了packed=true修饰repeated字段采用连续数据存储方式,即T - L - V - V -V方式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。