Java内建序列化机制

在Windows系统上序列化的Java对象,可以在UNIX系统上被重建出来,不需要担心不同机器上的数据表示方法,也不需要担心字节排列次序。

在Java中,使一个类的实例可被序列化非常简单,只需要在类声明中加入implements Serializable即可。Serializable接口是一个标志,不具有任何成员函数,其定义如下:

个长整数,但是它的序列化结果字节。包含个长整数的Block对象的序列化结果如下:

-84, -19, 0, 5, 115, 114, 0, 23, 111, 114, 103, 46, 115, 101, 97, 110, 100, 101, 110, 103, 46, 116, 101, 115, 116, 46, 66, 108, 111, 99, 107, 40, -7, 56, 46, 72, 64, -69, 45, 2, 0, 3, 74, 0, 7, 98, 108, 111, 99, 107, 73, 100, 74, 0, 16, 103, 101, 110, 101, 114, 97, 116, 105, 111, 110, 115, 83, 116, 97, 109, 112, 74, 0, 8, 110, 117, 109, 66, 121, 116, 101, 115, 120, 112, 108, 85, 103, -107, 104, -25, -110, -1, 0, 0, 0, 0, 3, 97, -69, -117, 0, 0, 0, 0, 2, 89, -20, -53

Hadoop序列化机制

和Java序列化机制不同(在对象流ObjectOutputStream对象上调用writeObject()方法),Hadoop的序列化机制通过调用对象的write()方法(它带有一个类型为DataOutput的参数),将对象序列化到流中。反序列化的过程也是类似,通过对象的readFields(),从流中读取数据。值得一提的是,Java序列化机制中,反序列化过程会不断地创建新的对象,但在Hadoop的序列化机制的反序列化过程中,用户可以复用对象,这减少了Java对象的分配和回收,提高了应用的效率。

public static void main(String[] args) {

try {

Block block1 = new Block(1L,2L,3L);

... ...

ByteArrayOutputStream bout = new ByteArrayOutputStream();

DataOutputStream dout = new DataOutputStream();

block1.write(dout);

dout.close();

... ...

}

... ...

}

由于Block对象序列化时只输出了3个长整数,block1的序列化结果一共有24字节。

Hadoop Writable机制

Hadoop引入org.apache.hadoop.io.Writable接口,作为所有可序列化对象必须实现的接口。

和java.io.Serializable不同,Writable接口不是一个说明性接口,它包含两个方法:

publicinterface Writable {

/**

* Serialize the fields of this object to <code>out</code>.

@param out <code>DataOuput</code> to serialize this object into.

@throws IOException

*/

void write(DataOutput out) throws IOException;

/**

* Deserialize the fields of this object from <code>in</code>.

* For efficiency, implementations should attempt to re-use storage in the

* existing object where possible.</p>

@param in <code>DataInput</code> to deseriablize this object from.

@throws IOException

*/

void readFields(DataInput in) throws IOException;

}

Writable.write(DataOutput out)方法用于将对象写入二进制的DataOutput中,反序列化的过程由readFields(DataInput in)从DataInput流中读取状态完成。下面是一个例子:

public class Block {

private long blockId;

private long numBytes;

private long generationsStamp;

public void write(DataOutput out) throws IOException {

out.writeLong(blockId);

out.writeLong(numBytes);

out.writeLong(generationsStamp);

}

public void readFields(DataInput in) throws IOException {

this.blockId = in.readLong();

this.numBytes = in.readLong();

this.generationsStamp = in.readLong();

if (numBytes < 0 ) {

throw new IOException("Unexpected block size:" + numBytes);

}

}

}

Hadoop序列化机制中还包括另外几个重要接口:WritableComparable、RawComparator和WritableComparator。

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如Integer自己就可以完成比较大小操作),实现Comparable接口的方法compareTo(),通过传入要比较的对象即可进行比较。

而Comparator是一个专用的比较器,可以完成两个对象之间大小的比较。实现Comparator接口的compare()方法,通过传入需要比较的两个对象来实现对两个对象之间大小的比较。

参考:

DataOutput接口实现类有: - liango - 博客园

http://www.cnblogs.com/liango/p/7122440.html

大数据框架hadoop的序列化机制的更多相关文章

  1. 老李分享:大数据框架Hadoop和Spark的异同 1

    老李分享:大数据框架Hadoop和Spark的异同   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  2. 老李分享:大数据框架Hadoop和Spark的异同

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  3. [转载] 2 分钟读懂大数据框架 Hadoop 和 Spark 的异同

    转载自https://www.oschina.net/news/73939/hadoop-spark-%20difference 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字 ...

  4. 2分钟读懂大数据框架Hadoop和Spark的异同

    转自:https://www.cnblogs.com/reed/p/7730313.html 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字并不陌生.但我们往往对它们的理解只是 ...

  5. 大数据框架hadoop服务角色介绍

    翻了一下最近一段时间写的分享,DKHadoop发行版本下载.安装.运行环境部署等相关内容几乎都已经写了一遍了.虽然有的地方可能写的不是很详细,个人理解水平有限还请见谅吧!我记得在写DKHadoop运行 ...

  6. 老李分享:大数据框架Hadoop和Spark的异同 2

    Spark数据处理速度秒杀MapReduce Spark因为其处理数据的方式不一样,会比MapReduce快上很多.MapReduce是分步对数据进行处理的: ”从集群中读取数据,进行一次处理,将结果 ...

  7. 哈,我自己翻译的小书,马上就完成了,是讲用python处理大数据框架hadoop,spark的

    花了一些时间, 但感觉很值得. Big Data, MapReduce, Hadoop, and Spark with Python Master Big Data Analytics and Dat ...

  8. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink

    转自:https://www.cnblogs.com/reed/p/7730329.html 今天看到一篇讲得比较清晰的框架对比,这几个框架的选择对于初学分布式运算的人来说确实有点迷茫,相信看完这篇文 ...

  9. 大数据框架:Spark vs Hadoop vs Storm

    大数据时代,TB级甚至PB级数据已经超过单机尺度的数据处理,分布式处理系统应运而生. 知识预热 「专治不明觉厉」之“大数据”: 大数据生态圈及其技术栈: 关于大数据的四大特征(4V) 海量的数据规模( ...

随机推荐

  1. 20145211《网络对抗》逆向及BOF基础实践

    逆向及BOF基础实践——又是一年梅落时 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  2. 2017-2018-1 Java小组-1623 第二周作业

    2017-2018-1 Java小组-1623 第二周作业 关于游戏软件的问题 讨论结果 20162301张师瑜 20162305李昱兴 20162306陈是奇 20162308马平川 2016231 ...

  3. zabbix3.2源码升级至3.4

    安装见:https://www.cnblogs.com/LuckWJL/p/9037007.html 一.下载3.4版本安装包 二.停ZabbixServer [root@wcy ~]# /etc/i ...

  4. Python学习札记(二十四) 函数式编程5 返回函数

    参考:返回函数 NOTE 1.高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. eg.求和函数 #!/usr/bin/env python3 def calsums(*args): a ...

  5. 【转载】解决telnet无法连接 Connection refused

    原文:解决telnet无法连接 Connection refused telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成 ...

  6. Codeforces Round #417 (Div. 2) D. Sagheer and Kindergarten(树中判祖先)

    http://codeforces.com/contest/812/problem/D 题意: 现在有n个孩子,m个玩具,每次输入x y,表示x孩子想要y玩具,如果y玩具没人玩,那么x就可以去玩,如果 ...

  7. POJ 2443 Set Operation(压位加速)

    http://poj.org/problem?id=2443 题意: 有1000个集合,每个集合有至多10000个数,之后输入多个询问,判断询问的两个数是否位于同一个集合. 思路: 位运算...很强大 ...

  8. Visualization data using R and bioconductor.--NCBI

  9. poj 3630 Phone List trie树

    Phone List Description Given a list of phone numbers, determine if it is consistent in the sense tha ...

  10. SSH基本管理和配置文件的使用

    服务端:linl_S    IP:10.0.0.15 客户端:lin_C    IP:10.0.0.16   SSHD服务 SSH协议:安全外壳协议.为Secure Shell的缩写.SSH为建立在应 ...