6、序列化

来源:互联网 发布:工业机器人编程原理 编辑:程序博客网 时间:2024/06/06 20:22
1)为何序列化
在面向对象程序设计中,对象是一个个重要并复杂的概念。一般而言,对象值存在于内存当中,当整个程序运行结束时,对象也就“消亡”了。所以一般来说,“活”对象只能在本地使用,不能跨计算机使用。但是为了计算机之间相互使用对象,便有了序列化的概念。所谓序列化,就是可以存储“活的”对象,将“活的”对象发送给远程计算机使用。序列化,就是将对象转换成字节流;反序列化,就是将字节流解析称对象。所以,我们一般把对象转换成字节流存储到文件中,又叫持久化。序列化对hadoop很重要,因为hadoop集群之间通讯或者RPC调用的时候,需要进行序列化,而且要求速度快,体积小,减少吞吐量。
2)如何序列化
hadoop提供了一系列的序列化接口类类IntWritable、DoubleWritable 和ByteWritable等,以下例子演示如何进行序列化。

package com.kevin.hadoop;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Writable;import org.apache.hadoop.util.StringUtils;public class IntSer {public byte[] serialize(Writable w)throws IOException{ByteArrayOutputStream out = new ByteArrayOutputStream();DataOutputStream dataout = new DataOutputStream(out);w.write(dataout);dataout.close();return out.toByteArray();}public byte[] deserialize(Writable w, byte[] bytes)throws IOException{ByteArrayInputStream in = new ByteArrayInputStream(bytes);DataInputStream datain = new DataInputStream(in);w.readFields(datain);datain.close();return bytes;}public static void main(String[] args)throws Exception{IntSer intSer = new IntSer();IntWritable intw = new IntWritable(7);byte[] bytes = intSer.serialize(intw);String bytes_str = StringUtils.byteToHexString(bytes);System.out.println(bytes_str);IntWritable intw2 = new IntWritable(0);intSer.deserialize(intw2,bytes);System.out.println(intw2);}}

byte[] serialize(Writable w):序列化函数

ByteArrayOutputStream():可以捕获内存缓冲区的数据,转换成字节数组
DataOutputStream(out):数据输出流,将java基本数据类型写入数据输出流中

deserialize(Writable w, byte[] bytes):反序列化函数

ByteArrayInputStream(bytes):将字节数组转换成输入流
DataInputStream(in):数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。






0 0