打赏

序列化 反序列化 输入流 输出流

     

 

 

  不多说,直接上干货!

 

 

很多人搞不清输入流和输出流,!!、!
  其实啊,输入流、输出流都是针对内存的
  往内存里写,是输入流。
  内存往文件里写,是输出流。

比如一个文件A复制到另一文件B,那么,先写到内存里,再写到文件B。
=> 则文件A写到内存里,叫输入流。
=> 则内存里写到文件B,叫输出流。

  对象不能传输的,需要转化成字节流!

 


  将对象转换为二进制的字节流并写入到输出流out中是序列化,write 的过程(最好记!!!)
  从输入流in中读取二进制的字节流反序列化为对象是反序列化,readFields的过程(最好记!!!)


  就是说,将对象转换成二进制的字节流,这里,就已经是从内存出发了。这里就是把二进制字节流写入输出文件里!
  序列化是把内存对象数据转成字节流存在临时文件里。
  反序列化是把临时文件的字节流转成对象数据!

 

 

  对象 -> (序列化) -> 字节流 -> (反序列化) 对象

 

  序列化和反序列化是在底层做的,其实我们看不到
  Hadoop是这样的,序列化是把内存对象数据转成字节流存在临时文件里,反序列化是把临时文件的字节流转成对象数据!
  Java序列化,和反序列化思想,就是把对象数据转成二进制的字节流,接受方再把二进制的字节流转成可用的数据对象,这就是反序列化!
  序列化的目的,就是为了传输的时候,流量小,速度快
  序列化和反序列化简单点,就是加密和解密一样,他们是一对的


  对象它是在内存中的吧,它需要在网络上传输首先得成网络中可以识别的,那什么是网络可识别的呢?
  文件流是网络是可以识别的对吧,但是对象又不能直接转成文件流,得先转成字节流再转成文件流。
  对象到文件流是序列化的一种。你也可以对象到txt文件也是一种序列化。

 


什么是序列化?
  将结构化对象(实例) 转换成二进制的字节流 (字符数组)以便于进行网络传输或写入持久存储的过程。

 

什么是反序列化?
  将字节流转换为一系列结构化对象的过程。

 

问:java里是对象数据,每次反序列和序列化,都要再new出,hadoop里,是内存对象数据,可以重复用。对吗?
  答:其实复不复是和序列化反序列化是没有关系的,
序列化和反序列化的目的,是在,为了传输的时候,流量小,速度快。跟复不复没扯上。
Hadoop只是把内存对象数据,存到临时文件,用到这内存对象数据的时候,再把它读到内存,这样就可以说是可以复用的。


什么叫持久化?
  将对象序列化存储到文件,术语又叫“持久化”。

什么叫数据通信?
  将对象序列化发送到远程计算机,术语又叫“数据通信”。


为什么要序列化?
  一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。

 

 

 

 

1、 序列化从头说
    在面向对象程序设计中,类是个很重要的概念。所谓“类”,可以将它想像成建筑图纸,而对象就是根据图纸盖的大楼。类,规定了对象的一切。根据建筑图纸造房子,盖出来的就是大楼,等同于将类进行实例化,得到的就是对象。
    一开始,在源代码里,类的定义是明确的,但对象的行为有些地方是明确的,有些地方是不明确的。对象里不明确地方,是因为对象在运行的时候,需要处理无法预测的事情,诸如用户点了下屏幕,用户点了下按钮,输入点东西,或者需要从网络发送接收数据之类的。后来,引入了泛型的概念之后,类也开始不明确了,如果使用了泛型,直到程序运行的时候,才知道究竟是哪种对象需要处理。
       对象可以很复杂,也可以跟时序相关。一般来说,“活的”对象只生存在内存里,关机断电就没有了。一般来说,“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。
      序列化,可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
      把“活的”对象序列化,就是把“活的”对象转化成一串字节,而“反序列化”,就是从一串字节里解析出“活的”对象。于是,如果想把“活的”对象存储到文件,存储这串字节即可,如果想把“活的”对象发送到远程主机,发送这串字节即可,需要对象的时候,做一下反序列化,就能将对象“复活”了。
       将对象序列化存储到文件,术语又叫“持久化”。将对象序列化发送到远程计算机,术语又叫“数据通信”。
       Java对序列化提供了非常方便的支持,在定义类的时候,如果想让对象可以被序列化,只要在类的定义上加上了”implements Serializable”即可,比如说,可以这么定义”public class Building implements Serializable”,其他什么都不要做,Java会自动的处理相关一切。Java的序列化机制相当复杂,能处理各种对象关系。
       Java的序列化机制的缺点就是计算量开销大,且序列化的结果体积大太,有时能达到对象大小的数倍乃至十倍。它的引用机制也会导致大文件不能分割的问题。这些缺点使得Java的序列化机制对Hadoop来说是不合适的。于是Hadoop设计了自己的序列化机制。
      为什么序列化对Hadoop很重要?因为Hadoop在集群之间进行通讯或者RPC调用的时候,需要序列化,而且要求序列化要快,且体积要小,占用带宽要小。所以必须理解Hadoop的序列化机制。

 

 

 

 

 

2. Hadoop的序列化接口
      什么是接口?简答来说,接口就是规定,它规定类必须实现的方法。一个接口可以包含多干个方法。如果一个类说自己实现了某个接口,那么它必须实现这个接口里的所有方法。特殊情况下,接口也可以没有任何方法。
     (1) Writable接口,也就是org.apache.hadoop.io.Writable接口。Hadoop的所有可序列化对象都必须实现这个接口。Writable接口里有两个方法,一个是write方法,将对象写入字节流,另一个是readFields方法,从字节流解析出对象。
      (2)Java的API提供了Comparable接口,也就是java.lang.Comparable接口。这个接口只有一个方法,就是compareTo,用于比较两个对象。
      (3) WritableComparable接口同时继承了Writable和Comparable这两个接口。
        Hadoop里的三个类IntWritable、DoubleWritable和ByteWritable,都继承了WritableComparable接口。注意,IntWritable、DoubleWritable和ByteWritable,尽管后缀是“Writable”,但它们不是接口,是类!!
      Hadoop的序列化接口还有更多的类型,在这里不一一列举。

 

 

 

 

大数据入门基础系列之Hadoop文件的序列化,为什么不用Java的序列化

   见我写的微信公众号博文

 

 

 

 

posted @ 2017-10-11 20:33  大数据和AI躺过的坑  阅读(1008)  评论(0编辑  收藏  举报