6、序列化

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 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值