zoukankan      html  css  js  c++  java
  • 序列化 反序列化 输入流 输出流

         

      不多说,直接上干货!

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

    比如一个文件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的序列化

       见我写的微信公众号博文

     

  • 相关阅读:
    纪中第三天
    纪中第一天
    图片验证码的实现
    使用监听器解决路径问题
    log4j测试示例
    redis示例
    kafka示例
    CSRF verification failed. Request aborted.
    TemplateDoesNotExist
    创建 django 项目命令
  • 原文地址:https://www.cnblogs.com/zlslch/p/5634101.html
Copyright © 2011-2022 走看看