首页 » Web前端 » phpprotocolbuff技巧_Android序列化Google出品的序列化神器Protocol Buffer

phpprotocolbuff技巧_Android序列化Google出品的序列化神器Protocol Buffer

访客 2024-11-21 0

扫一扫用手机浏览

文章目录 [+]

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

总结

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

phpprotocolbuff技巧_Android序列化Google出品的序列化神器Protocol Buffer

5. 利用流程利用 Protocol Buffer 的流程如下:

phpprotocolbuff技巧_Android序列化Google出品的序列化神器Protocol Buffer
(图片来自网络侵删)
今天主要讲解Protocol Buffer在Android平台 的详细利用

6. 运用实例(Android平台)详细步骤如下:

步骤1:将天生的 代码文件 放入到项目中

对付Android(Java)平台,即将编译.proto文件天生的Java包文件 全体复制到 Android项目中放置路径: app/src/main/java的 文件夹里

步骤2:在 Gradle 添加 Protocol Buffer 版本依赖

compile 'com.google.protobuf: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(OutputStream output);output.toByteArray();// 将写入 输出流 ,然后再 序列化 protocolBuffer.parseFrom(InputStream input);// 从一个 输入流 读取并 反序列化(解析)// 只含包含字段的getters方法// required string name = 1;public boolean hasName();// 如果字段被设置,则返回truepublic java.lang.String getName();// required int32 id = 2;public boolean hasId();public int getId();// optional string email = 3;public boolean hasEmail();public String getEmail();// repeated .tutorial.Person.PhoneNumber phone = 4;// 重复(repeated)字段有一些额外方法public List<PhoneNumber> 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 hasName();// 如果字段被设置,则返回truepublic java.lang.String getName();public Builder setName(String value);public Builder clearName(); // 将字段设置回它的空状态// required int32 id = 2;public boolean hasId();public int getId();public Builder setId(int 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<PhoneNumber> getPhoneList();public int getPhoneCount();// 列表大小的速记// 浸染:通过索引获取和设置列表的特定元素的getters和setterspublic PhoneNumber getPhone(int index);public Builder setPhone(int index, PhoneNumber value);public Builder addPhone(PhoneNumber value);// 将新元素添加到列表的末端public Builder addAllPhone(Iterable<PhoneNumber> 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(\公众carson.ho@foxmail.com\"大众); // 在定义.proto文件时,该字段的字段润色符是optional,以是可赋值 / 不赋值(不赋值时将利用默认值) Demo.Person.PhoneNumber.Builder phoneNumber = Demo.Person.PhoneNumber.newBuilder(); phoneNumber.setType( Demo.Person.PhoneType.HOME);// 直接采取列举类型里的值进行赋值 phoneNumber.setNumber(\公众0157-23443276\公众); // 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.println(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); // 通过 输入流 吸收流(此处用 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的利用讲解完毕。

相关文章

介绍百度码,技术革新背后的智慧之光

随着科技的飞速发展,互联网技术已经成为我们生活中不可或缺的一部分。而在这个信息爆炸的时代,如何快速、准确地获取信息,成为了人们关注...

Web前端 2025-01-03 阅读1 评论0

介绍皮箱密码,开启神秘之门的钥匙

皮箱,作为日常生活中常见的收纳工具,承载着我们的珍贵物品。面对紧闭的皮箱,许多人却束手无策。如何才能轻松打开皮箱呢?本文将为您揭秘...

Web前端 2025-01-03 阅读1 评论0

介绍盗号器,网络安全的隐忧与应对步骤

随着互联网的快速发展,网络安全问题日益突出。盗号器作为一种非法工具,对网民的个人信息安全构成了严重威胁。本文将深入剖析盗号器的原理...

Web前端 2025-01-03 阅读1 评论0