序列化
序列化将对象变成一串字节流
序列化可以理解为对象级别的压缩方式
不用序列化能否保存磁盘上?
可以,但是你要将对象中一个个的基本属性进行写入操作,比如int之流, 当然, 按你自己希望的顺序,规则.
序列化和持久化之间的关系
序列化过程是持久化的一种方式,当然Java中你可以选择适当的方式编码(utf-8)。
序列化和压缩的目的都是为了节省空间?有啥区别?
序列化可理解为将一个组合办公桌(对象)按标准拆解为散件,以方便运输(网络上传输),到达目的地后再重新组装成一个整体办公桌,所以序列化的目的不是压缩,而是变成 流以方便网络传输并能重新组装为对象, 后来大家又发现一张桌子有四条腿,不需要运输1111这种方式,改成1,4就可以了,这就是压缩了
压缩
压缩则是将一个大容量的文件通过一些压缩算法(gzip、bzip2等命令)变成一个小容量的文件
打包和压缩
打包是指将一大堆文件或目录什么的变成一个总的文件
为什么要区分这 两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另外的工具将这一大堆文件先打 成一个包,然后再就原来的压缩程序进行压缩。
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了
tar命令
# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等
tar调用gzip
gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用 -z 这个参数来调用gzip。下面来举例说明一下:
# tar -czf all.tar.gz *.jpg
这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz
tar调用bzip2
bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用 -j 这个参数来调用bzip2。下面来举例说明一下:
# tar -cjf all.tar.bz2 *.jpg
这条命令是将所有.jpg的文件打成一个tar包,并且调用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2
对象的序列化
对象的序列化(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流中读取状态,重建对象;
consult:
https://blog.csdn.net/qq_30366667/article/details/77323976
https://blog.csdn.net/cloudeagle_bupt/article/details/27191685
https://blog.csdn.net/ji519974770/article/details/81916468 Linux 打包和压缩的概念和区别