Hadoop基础-Protocol Buffers串行化与反串行化

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  我们之前学习过很多种序列化文件格式,比如python中的pickle序列化方式(https://www.cnblogs.com/yinzhengjie/p/8531308.html),golang的Gob序列化方式(https://www.cnblogs.com/yinzhengjie/p/7807051.html),hadoop的SequenceFile序列化文件(https://www.cnblogs.com/yinzhengjie/p/9114301.html),Java内置的ObjectOutputStream序列化方式(https://www.cnblogs.com/yinzhengjie/p/8988003.html)等等。

  当然,除了语言自己内置的序列化方式外,还有一些手动二进制编码的序列化文件,以及人性化可读格式的序列化文件,比如XMl,JSON,DOM,SAX,STAX,JAXB,JAXP等等,不过这些序列化方式都不是今天的主角,我今天要介绍的是Google公司在2008年就开源的一种序列化方式,即Protocol Buffers序列化。

一.Protocol Buffers 简介

1>.什么是 Protocol Buffers 

  第一:A description language(一种描述语言);

  第二:A complier(它是一个编译器);

  第三:A library(它是一种库);

2>.Protocol Buffers 优点

  第一:易于使用,高效的二进制编码;

  第二:它是由谷歌公司研发的;

  第三:简单高效的串行化技术,在2008公开该技术;

3>.支持跨语言

  官方支持:Java, C++, and Python等等

  非官方支持:C, C#, Erlang, Perl, PHP, Ruby等等

二.Protocol Buffers 代码生成

1>.创建emp.proto自描述文件(非java文件,具体内容如下)

package tutorial;
option java_package = "tutorialspoint.com";
option java_outer_classname = "Emp2";
message Emp {
required int32 id = 1;
required string name = 2;
required int32 age = 3;
required int32 salary = 4;
required string address = 5;
}

2>.将emp.proto(下载地址:链接:https://pan.baidu.com/s/1crYmFwI68kUnzwJgoyOdpw 密码:bh63)和protobuf\src\protoc.exe放在同一个文件夹

3>.编译emp.proto(protoc --java_out=. emp.proto)

4>.将"D:\10.Java\IDE\yhinzhengjieData\ProtocolBuffers\tutorialspoint\com"(这是我本地目录)下的Emp2.java放置在idea中,包名“tutorialspoint.com

三.编写代码

1>.编写串行化代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.protocolBuffers; import tutorialspoint.com.Emp2; import java.io.File;
import java.io.FileOutputStream; public class MyProtocolBuffers { private static final File protocolBuffers = new File("D:\\10.Java\\IDE\\yhinzhengjieData\\ProtocolBuffers\\emp.protocolBuffers"); public static void main(String[] args) throws Exception {
protocolBuffersSerial();
}
/**
* 定义序列化方式
*/
public static void protocolBuffersSerial() throws Exception {
long start = System.currentTimeMillis();
FileOutputStream fos = new FileOutputStream(protocolBuffers);
//注意,在序列化一个对象的时候,都是打点的方式设置的哟!在设置完毕后需要以".build"结束!
Emp2.Emp emp = Emp2.Emp.newBuilder().
setId(1).
setName("尹正杰").
setAge(18).
setSalary(66666666).
setAddress("北京").build();
//我们循环写入数据
for (int i = 0; i < 10000000; i++) {
emp.writeTo(fos);
}
fos.close();
System.out.printf("这是protocol Buffers序列化方式: 生成文件大小:[%d],用时:[%d]\n",protocolBuffers.length(),System.currentTimeMillis() - start);
}
} /*
以上代码执行结果如下:
这是protocol Buffers序列化方式: 生成文件大小:[280000000],用时:[10960]
*/

  执行以上代码后,在本地目录会生成一个文件如下:

2>.编写反串行化代码

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.protocolBuffers; import tutorialspoint.com.Emp2; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; public class MyProtocolBuffers { private static final File protocolBuffers = new File("D:\\BigData\\JavaSE\\yinzhengjieData\\ProtocolBuffers\\emp.protocolBuffers"); public static void main(String[] args) throws Exception {
protocolBuffersSerial();
protocolBuffersDeserial();
}
/**
* 定义序列化方式
*/
public static void protocolBuffersSerial() throws Exception {
long start = System.currentTimeMillis();
FileOutputStream fos = new FileOutputStream(protocolBuffers);
//注意,在序列化一个对象的时候,都是打点的方式设置的哟!在设置完毕后需要以".build"结束!
Emp2.Emp emp = Emp2.Emp.newBuilder().
setId(1).
setName("尹正杰").
setAge(18).
setSalary(66666666).
setAddress("北京").build();
//我们循环写入数据
for (int i = 0; i < 2000000; i++) {
emp.writeTo(fos);
}
fos.close();
System.out.printf("这是protocol Buffers序列化方式: 生成文件大小:[%d],用时:[%d]\n",protocolBuffers.length(),System.currentTimeMillis() - start);
} /**
* 定义反序列化方式
*/
public static void protocolBuffersDeserial() throws Exception {
long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(protocolBuffers); Emp2.Emp emp = Emp2.Emp.parseFrom(fis); for (int i = 0; i < 2000000; i++) {
emp.getId();
emp.getName();
emp.getAge();
emp.getSalary();
emp.getAddress();
}
System.out.printf("这是protocol Buffers反序列化方式: 生成文件大小:[%d],用时:[%d]\n",protocolBuffers.length(),System.currentTimeMillis() - start);
} }

Hadoop基础-Protocol Buffers串行化与反串行化的更多相关文章

  1. Hadoop基础-Apache Avro串行化的与反串行化

    Hadoop基础-Apache Avro串行化的与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Apache Avro简介 1>.Apache Avro的来源 ...

  2. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  3. C#基础知识回顾--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上, 在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性, ...

  4. C#--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性,就 ...

  5. Hadoop基于Protocol Buffer的RPC实现代码分析-Server端

    http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.google.co ...

  6. Protocol Buffers学习教程

    最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...

  7. Google Protocol Buffers 入门

    Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的 ...

  8. Hadoop基础-MapReduce的常用文件格式介绍

    Hadoop基础-MapReduce的常用文件格式介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MR文件格式-SequenceFile 1>.生成SequenceF ...

  9. Hadoop基础-MapReduce的工作原理第二弹

    Hadoop基础-MapReduce的工作原理第二弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Split(切片)  1>.MapReduce处理的单位(切片) 想必 ...

随机推荐

  1. First Scrum Meeting (2015/10/18)

    会议是在昨晚进行的,本来早就应该写博了,可惜今天校园网炸个不停= =.刚修好就赶紧来发博客. 会议基本要素 会议主题:爬虫项目的核心技术讨论以及项目初期的工作分配 会议时间:2015.10.18 19 ...

  2. 第二阶段Sprint冲刺会议9

    进展:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码,没有成功.

  3. 第二阶段Sprint冲刺会议2

     进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写. 

  4. whu 1538 - B - Stones II 01背包

    题目链接: http://acm.whu.edu.cn/land/problem/detail?problem_id=1538 Problem 1538 - B - Stones II Time Li ...

  5. Linux(Red hat)无网离线安装TensorFlow

    文件下载 首先,下载想要安装的版本,目前最新的是1.8.0 根据你的python版本下载对应的whl文件,下载连接:https://pypi.org/project/tensorflow/#files ...

  6. 记:ASP.NET Core开发时部署到IIS上出现HTTP Error 502.5 - Process Failure的解决方案

    HTTP Error 502.5 - Process Failure Common causes of this issue: The application process failed to st ...

  7. Hibernate(十)

    1.批处理 //批处理 :批量处理 //批量插入数据 @Test public void addData(){ Random random=new Random(); for(int i=1;i< ...

  8. js汉字按字母排序

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. 解决win10激活错误代码0xc004c003

    打开命令窗口(管理员). win10电脑图解-2 输入slmgr.vbs /upk,回车 激活错误电脑图解-3 输入:slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX, ...

  10. windows多线程(二) 等待线程返回

    多线程编程中,有时我们需要等待某一线程完成了特定的操作后再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleO ...