三清山,开题报告,寻仙-呦吼福库,集福大本营

admin 6个月前 ( 05-29 01:35 ) 0条评论
摘要: 相信大多都没听过ProtocolBufferProtocolBuffer其实是Google出品的一种轻量&高效的结构化数据存储格式。...

Android序列化:Google出品的序列化神器Protocol Buffer

前语

  • 习惯用 Json、XML 数据存储格局的你们,信任大多都没听过Protocol Buffer
  • Protocol Buffer 其实 是 Google出品的一种轻量 &平井絵里 高效的结构化数据存储格局,性能比 Json、XML 真的强!太!多!

因为 Google出品,我信任Protocol Buffer现已具有满足的吸引力

  • 今日,我将详细介绍Protocol Bu勾背枯叶螳螂ffer在Android渠道 的详细运用

阅览本文前请先阅览:快来看看Google出品的Protocol Buffer,别只会用Json和XML了


目录


1. 界说

一种 结构化数据 的数据存储格局(类似于 XML、Json )三清山,开题陈述,寻仙-呦吼福库,集福大本营

  • Google 出品 (开源)
  • Protocol Buffer 现在有两个版别:proto2 和 proto3
  • 因为proto3 仍是beta 版,所以本次解说是 proto2

2. 效果

经过将 结构化的数据 进行 串行化(序列化),然后完成 数据存储 / RPC 数据交换的功用

  • 序列化: 将 数据结构或目标 转化成 二进制串 的进程
  • 反序列化:将在序列化进程中所生成的二进制串 转化成 数据结构或许目标 的进程

3. 特色

  • 比照于 常见的 XML、Json 数据存储格局,Protocol Buffer有如下特色:


4. 运用场景

传输数据量大 七宝闹翻天& 网络环境不稳定 的数据存储、RPC 数据交换 的需求场景

如 即时IM (QQ、微信)的需求场景


总结

传输数据量较大的需求场景下,Protocol Buffer比XML、Json 更小、更快、运用 & 保护更简略!


5. 运用流程

  • 运用 Protocol Buffer 的流程如下:

  • 今日首要解说Protocol Buffer在Android渠道 的详细运用


6. 运用实例(Android渠道)

  • 详细过程如下:

过程1:将生成的 代码文件 放入到项目中

  • 关于Android(Java)渠道,行将编译.proto文件生成的Java包文件 整个仿制到 Android项目中
  • 放置途径: app/src/main/java的 文件夹里

过程2:在 Gradle 增加 Protocol Buffer 版别依靠

compile 'com.google.proto小浩病毒buf:protobuf-java:2.6.1'
// 注:protobuf-java的版别 必定要和 装置protocobuffer的版别 共同
仿制代码

过程3:详细在Android项目中运用

3.1 音讯目标类介绍

经过.proto文件 转化的 Java源代码 = Protocol Buffer 类 + 音讯目标类(含Builder内部类)

音讯目标类 是 Protocol Buffer 类的内部类

因为最常用的都是 音讯目标类 维美小型家用榨油机和其内部类Builder类 的办法&成员变量,所以此处首要解说这两者。

3.1.1 音讯目标类(Message类)

  • 音讯目标类 类经过 二进制数组 写 和 读 音讯类型
  • 运用办法包括:
<-- 办法1:直接序列化和反序列化 音讯 -->
protocolBuffer.toByteArray();
// 序列化音讯 并 回来一个包括它的原始字节的字节数组
protocolBuffer.parseFrom(byte[] data);
// 从一个字节数组 反序列化(解析) 音讯
<-- 办法2:经过输入/ 输出流(如网络输出流) 序列化和反序列化音讯 -->
protocolBuffer.writeTo(Outputcf生化酒店卡厕所Stream output);
output.toByteArray();
// 将音讯写入 输出流 ,然后再 序列化音讯
protocolBuffer.parseFrom(InputStream input);
// 从一个 输入流 读取并 反序列化(解析)音讯
// 只含包括字段的getters办法
// required string name = 1;
public boolean hasName();// 假如字段被设置,则回来true
public java.lang.String getName();
// required int32 id = 2;
public boolean hasId();
public int getg7052Id();
// optional string email = 3;
public boolean hasEmail();
public String getEmail();
// repeated .tutorial.Person.PhoneNumber phone = 4;
// 重复(repeated)字段有一些额定办法
public List getPhoneList();
public int getPhoneCount();
// 列表巨细的速记
// 效果:经过索引三清山,开题陈述,寻仙-呦吼福库,集福大本营获取和设置列表的特定元素的getters和setters
仿制代码

常用的如上,更多请看官方文档

3.1.2 Builder类

效果:创立 音讯结构器 & 设置/ 获取音讯目标的字段值 & 创立 音讯类 实例

归于 音讯目标类 的内部类

a. 创立 音讯结构器

Demo.Person.Builder person = Person.newBuilder();
仿制代码

b. 设置/ 获取 音讯目标的字段值 详细办法如下:

// 规范的JavaBeans风格:含getters和setters
// required string name = 1;
public boolean has殷珊Name();// 假如字段被设置,则回来true
public java.lang.String get珍嘉丽Name();
public Builder setName(String value);
public Builder clearName(); // 将字段设置回它的空状况
// required in焦刚的博客t32 id = 2;
public boolean hasId();
public int getId();
public Builder setId(i三清山,开题陈述,寻仙-呦吼福库,集福大本营nt value);
public Builder clearId();
// optional string email = 3;
public boolean hasEmail();
public String getEmail();
public Builder setEmail(String value);
public Builder 收回高铬砖clearEmail();
// repeated .tutorial.Person三清山,开题陈述,寻仙-呦吼福库,集福大本营.PhoneNumber phone = 4;
// 重复(repeated)字段有一些额定办法
public List getPhoneList();
public int getPhoneCount();
// 列表巨细的速记
// 效果:经过索引获取和设置列表的特定元素的getters和setters
public PhoneNumber getPhone(int index);
public Builder setPhone(int index, PhoneNumber value);
public Builder addPhone(PhoneNumber value);
// 将新元素增加到列表的结尾
public Builder addAllPhone(Iterable value);
// 将一个装满元素的整个容器增加到列表中
public Builder clearPhone();
public Builder isInitialized()
// 检查一切 required 字段 是否都现已被设置
public Builder toString() :
// 回来一个人类可读的音讯表明(用于调试)
public Builder mergeFrom(Message other)
// 将 其他内容 合并到这个音讯中,覆写奇数的字段,附接重复的。
public Builder clear()
// 清空塔勒农场一切的元素为空状况。
仿制代码

3.2 详细运用

  • 运用过程如下: **过程1:**经过 音讯类的内部类Builder类 结构 音讯结构器 **过程2:**经过 音讯结构器 设置 音讯字段的值 **过程3:**经过 音讯结构器 创立 音讯类 目标 **过程4:**序列化 / 反序列化 音讯
  • 详细运用如下:(注释十分明晰)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 过程1:经过 音讯类怎样做发面饼又宣又软的内部类Builder类 结构 音讯类的音讯结构器
Demo.Person.Builder personBuilder = Demo.Person.newBuilder();
// 过程2:设置你想要设置的字段为你挑选的值
personBuilder.setName("Carson");// 在界说.proto文件时三清山,开题陈述,寻仙-呦吼福库,集福大本营,该字段的字段修饰符是required,所以斯缇姆游戏渠道有必要赋值
personBuilder.setId(123);// 在界说.proto文件时,该字段的字段修饰符是required,所以有必要赋值
personBuilder.setEmail("carso强制绝顶n.ho@foxmail.com三清山,开题陈述,寻仙-呦吼福库,集福大本营"); // 在界说.proto文件时,该字段的字段修饰符是optional,所以可赋值 / 不赋值(不赋值时将运用默认值)
Demo.Person.PhoneNumber.Builder phoneNumber = Demo.Person.PhoneNumber.newBuilder();
phoneNumber.setType( Demo.Person.PhoneType.HOME);// 直接选用枚举类型里的值进行赋值
phoneNumber.setNumber("0157-23443巢母卡克西276");
// PhoneNumber音讯是嵌套在Person音讯里,能够理解为内部类
// 所以创立目标时要经过外部类来创立
// 过程3:经过 音讯结构器 创立 音讯类 目标
Demo.Person person = personBuilder.build();
// 过程4:序列化和反序列化音讯(两种办法)
/*办法1:直接 序列化 和 反序列化 音讯 */
// a.序列化
byte[] byteArray1 = person.toByteArray();
// 把 person音讯类目标 序列化为 byte[]字节数组
System.out.println(Arrays.toString(byteArray1));
// 检查序列化后的字节省

// b.反序列化
try {
Demo.Person person_Request = Demo.Person.parseFrom(byteArray1);
// 当接纳到字节数组byte[] 反序列化为 person音讯类目标
System.out.pr三清山,开题陈述,寻仙-呦吼福库,集福大本营intln(person_Request.getName());
System.out.println(person_Request.getId());
System.out.println(person_Request.getEmail());
// 输出反序列化后的音讯
} catch (IOException e) {
e.printStackTrace();
}

/*办法2:经过输入/ 输出流(如网络输出流) 序列化和反序列化音讯 */
// a.序列化
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
person.writeTo(output);
// 将音讯序列化 并写入 输出流(此处用 ByteArrayOutputStream 替代)
} catch (IOException e) {
e.printStackTrace();
}
byte[] byteArray = output.toByteArray();
// 经过 输出流 转化成二进制字节省
// b. 反序列化
ByteArrayInputStream input = new ByteArrayInputStream(byteArray);
// 经过 输入流 接纳音讯东方蜜1号流(此处用 ByteArrayInputStream 替代)
try {
Demo.Person person_Request =三級片 Demo.Person.parseFrom(input);
// 经过输入流 反序列化 音讯
System.out.println(person_Request.getName());
System.out.println(person_Request.getId());
System.out.println(person_Request.getEmail());
// 输出音讯
} catch (IOException e) {
e.printStackTrace();
}

}
}
仿制代码

Demo 地址

Carson_Ho的Github :github.com/Carson-Ho/P…

高档功用

  • 交心的Google还供给将Protocol Buff 编码办法 转化为 其他编码办法,如 Json、XML孟崇然等等

行将 Protocol Buff 目标 转化为其他编码办法的数据存储目标

  • 下面展现的是 将 Protocol Buff 目标 转化为 Json目标
// 过程1:在Gradle参加依靠
compile 'com.googlecode.protobuf-java-format:protobuf-java-format:1.4'
// 过程2:将`Protocol Buff` 目标 序列化 为 `Json`目标
JsonFormat jsonFormat = new JsonFormat();
String person2json = jsonFormat.printToString(mProtoBuffer);
仿制代码

至此, 关于Protocol Buffer的运用解说结束。

文章版权及转载声明:

作者:admin本文地址:http://www.fukuryouhousuu.com/articles/1550.html发布于 6个月前 ( 05-29 01:35 )
文章转载或复制请以超链接形式并注明出处呦吼福库,集福大本营