序列化与压缩

来源:互联网 发布:数据库设计三大范式 编辑:程序博客网 时间:2024/06/05 11:29

对象的序列化(Serialization)用于将对象编译成一个字节流,以及从字节流里重新构建对象,将一个对象编码成一个字节流为欸序列化该对象;相反处理为反序列化(Deserializing);

序列化有三种主要途径:

作为一种持久化格式:一个对象序列化以后他的编码吗可以存储在磁盘上;供以以后反序列化使用;

作为一种通信数据格式:序列化结果可以从一个正在运行的虚拟机通过网络被传递到另一个虚拟机上;作为一种拷贝,克隆(clone)机制:将对象序列化到内存的缓冲区中;然后通过反序列化可以得到一个深拷贝的对象;

在分布式数据处理中主要使用的是前两种功能:数据持久化和通信数据格式;

java序列化机制

java序列化机制是将数据转换为连续的byte数据;并且该机制不用担心平台移植性;java的类的可实例化只需在类的声明里implements Serivalizable接口即可;

block要实现序列化需要implements Writable,comparaable<Block>,Serializable;

由于序列化主要应用在与I/O相关的一些操作上,其实就是通过一对输入输出流来实现的,如果要进行序列化动作,可以在某种outputStream对象的基础上创建一个ObjectOutputStream对象,前者作为后者的参数,然后调用writeObject()就可以达到目的;

writeObject()方法负责写入实现了Serivalizabl额接口的对象的状态信息,输出数据将被送至该OutputStream,多个对象序列化可以在ObjectOutputStream上多次调用WriteObject()方法;分别写入这些对象,下面是一些例子

Block block1=new Block(2342342342342342L,2342342423423L,23423423234L);Block block2=new Block(2343245435345234L,4325464564353L,23423423455L);ByteArrayOutStream out=new ByteArrayOutStream();ObjectOutputStream objout=new ObjectOutputStream(out);objout.writeObject(block1);

对于java基本类型的序列化,ObjectOutputStream提供了writeBoolean(),WriteByte()等方法;

输入过程类似,将InputStream包装在ObjectInputStream中并调用readObject(),该方法返回一个只想向上转型后的Object的引用,通过向下转型,可以得到正确结果;

hadoop序列化

hadoop序列化有所不同,是通过调用对象的write()方法,write方法的参数是DataOutput类的参数;

反序列化是通过对象的readFields()方法,从流中读取数据;

java反序列化中会不断的创建新的对象,hadoop反序列化机制中用户可以复用对象;

hadoop的序列化机制要求要紧凑,快速,可扩展,互操作,为了支持这些特性,引入了org.apache.hadoop.io.Writable接口作为序列化对象必须实现的接口;

并且该接口里面有两个方法分别是 void write(DataOutput out) throws IOException;

void readFields(DataInput in) throws IOException;

其中write方法是用来将对象状态写入二进制的DataOutput中;反序列化readFields()从DataInput流中读取状态,重建对象;

原创粉丝点击