如 即时IM (QQ、微信)的需求场景
总结在 传输数据量较大的需求场景下,Protocol Buffer比XML、Json 更小、更快、利用 & 掩护更大略!

步骤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的利用讲解完毕。