Writable接口

来源:互联网 发布:数据泄露防护系统破解 编辑:程序博客网 时间:2024/05/21 22:57
在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;
       }

     }



让我们再来看一个常用的类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





0 0