热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hadoop基础ProtocolBuffers串行化与反串行化

                    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放在同一个文件夹

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

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

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

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

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

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

 

三.编写代码

1>.编写串行化代码

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

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

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

2>.编写反串行化代码

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.protocolBuffers;
 7 
 8 import tutorialspoint.com.Emp2;
 9 
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.FileOutputStream;
13 
14 public class MyProtocolBuffers {
15 
16     private static  final File protocolBuffers = new File("D:\\BigData\\JavaSE\\yinzhengjieData\\ProtocolBuffers\\emp.protocolBuffers");
17 
18 
19     public static void main(String[] args) throws Exception {
20         protocolBuffersSerial();
21         protocolBuffersDeserial();
22     }
23     /**
24      * 定义序列化方式
25      */
26     public static void protocolBuffersSerial() throws Exception {
27         long start = System.currentTimeMillis();
28         FileOutputStream fos = new FileOutputStream(protocolBuffers);
29         //注意,在序列化一个对象的时候,都是打点的方式设置的哟!在设置完毕后需要以".build"结束!
30         Emp2.Emp emp = Emp2.Emp.newBuilder().
31                 setId(1).
32                 setName("尹正杰").
33                 setAge(18).
34                 setSalary(66666666).
35                 setAddress("北京").build();
36         //我们循环写入数据
37         for (int i = 0; i <2000000; i++) {
38             emp.writeTo(fos);
39         }
40         fos.close();
41         System.out.printf("这是protocol Buffers序列化方式: 生成文件大小:[%d],用时:[%d]\n",protocolBuffers.length(),System.currentTimeMillis() - start);
42     }
43 
44     /**
45      * 定义反序列化方式
46      */
47     public static void protocolBuffersDeserial() throws Exception {
48         long start = System.currentTimeMillis();
49         FileInputStream fis = new FileInputStream(protocolBuffers);
50 
51         Emp2.Emp emp = Emp2.Emp.parseFrom(fis);
52 
53         for (int i = 0; i <2000000; i++) {
54             emp.getId();
55             emp.getName();
56             emp.getAge();
57             emp.getSalary();
58             emp.getAddress();
59         }
60         System.out.printf("这是protocol Buffers反序列化方式: 生成文件大小:[%d],用时:[%d]\n",protocolBuffers.length(),System.currentTimeMillis() - start);
61     }
62 
63 }

 


推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
妩媚天天想我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有