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. 2018-2019-20172329 《Java软件结构与数据结构》第六周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第六周学习总结 学无止境,希望自己可以坚持下去,就算自己有太多的事情也不希望自己落下学习,也希望自己可以活成自己想要的样 ...

  2. CMD命令操作符

    cmd                   command的缩写,是windows环境下的虚拟DOS窗口,提供有DOS命令,功能强大 mstsc                 远程 inetmgr  ...

  3. 第一次spring冲刺第3、4天

    11月14至15日 因为忙于项目的谈论与探究,以及周末的活动变动,使得博客没有时间提交上去,这里补交. 这两天,主要是应对于市场的探究做谈论,我们主要面对什么类型的客户,以及他们最需要的是什么等话题做 ...

  4. 旧文备份:CANopen中SYNC的功能和使用

    SYNC是CANopen管理各节点同步数据收发的一种方法,相当于网络节拍,基于同步的PDO按照这个网络节拍来执行实时数据的收发.SYNC属于生产/消费型通讯方式,网络中有且只有一个SYNC生产者,一般 ...

  5. 简单复利计算c语言实现

    #include<stdio.h>#include<math.h>float i; //利率 float p; //期初金额 float F; //未来值 int n; //期 ...

  6. jmeter 多线程组间变量共享

    jmeter的线程组之间是相互独立的,各个线程组互不影响,所以线程组A中输出的参数,是无法直接在线程组B中被调用的. 但是有时为了方便管理,我们可能是把各个接口单独存放在不同的线程组中.拿Cookie ...

  7. PHP 常用函数总结(二)

    4.PHP处理数据库的常用函数. 汇总表 PHP 5 MySQLi 函数 函数 描述 mysqli_affected_rows() 返回前一个 Mysql 操作的受影响行数. mysqli_autoc ...

  8. Support for SSL/TLS protocols on Windows

    https://blogs.msdn.microsoft.com/kaushal/2011/10/02/support-for-ssltls-protocols-on-windows/ Support ...

  9. 在Android上使用Socket

    原文地址:http://www.cnblogs.com/kross/p/3621952.html 考虑到以后可能要用到这方面的知识,就来写个Demo尝试下,其实以前学过,但不记得了……(用不到的东西各 ...

  10. ACM数论之旅1---素数(万事开头难(>_<))

    前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么区别,反正以后有关数学的知识我都扔进数论分类里面好了) 于是我就准备写一个长篇集,把我知道的数论知识和ACM模板都发上来(而且 ...