在org.apache.hadoop.io中,hadoop使用自己的序列化格式Writables接口,具有紧凑,快速的特点,不过目前只有用Java才能较容易扩展。在hadoop中,它一般用于MapReduce程序的序列化 键值对 。它是基于java.io 中的数据输入输出流DataInput和DataOutput的。
void readFields(DataInput in) //从in流反序列化出内容(在hadoop中,为了高效率,会尽可能优先找到储存中已存在的对象将它取出复用)。
void write(DataOutput out)//把内容序列化到out流
下面就给出hadoop官方文档中推荐的例子:
public class MyWritable implements Writable { //自己定义一个类实现Writable接口,定义两个私有成员变量
// Some data
private int counter;
private long timestamp;
//覆写write方法,该方法使用out参数对象把counter和timestamp写到out中(也就是序列化的过程)。
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
//覆写readFields方法,该方法用in参数对象把数据读取到counter和timestamp中(也就是反序列化的过程)。
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
//设定一个静态方法,使用此方法可以返回一个Writable对象实例
public static MyWritable read(DataInput in) throws IOException {
MyWritable w = new MyWritable();
w.readFields(in);
return w;
}
void readFields(DataInput in) //从in流反序列化出内容(在hadoop中,为了高效率,会尽可能优先找到储存中已存在的对象将它取出复用)。
void write(DataOutput out)//把内容序列化到out流
下面就给出hadoop官方文档中推荐的例子:
public class MyWritable implements Writable { //自己定义一个类实现Writable接口,定义两个私有成员变量
// Some data
private int counter;
private long timestamp;
//覆写write方法,该方法使用out参数对象把counter和timestamp写到out中(也就是序列化的过程)。
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
//覆写readFields方法,该方法用in参数对象把数据读取到counter和timestamp中(也就是反序列化的过程)。
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
//设定一个静态方法,使用此方法可以返回一个Writable对象实例
public static MyWritable read(DataInput in) throws IOException {
MyWritable w = new MyWritable();
w.readFields(in);
return w;
}
}
让我们再来看一个常用的类IntWritable,它是java对int对象的一个封装,我们可以这样使用构造函数实例化对象。
IntWritable writable = new IntWritable(163);
我们使用内存操作流ByteArrayOutputStream和数据操作流DataOutputStream来查看这个writable中的序列化形式:
static byte [] serialize(Writable writable){
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
writable.write(dataOut);
dataOut.close();
return out.toByteArray();
}
byte[] bytes = serialize(writable);
再用Junit4断言,得到它的序列化形式为00000a3