为什么要串行化?串行化的是怎么进行的!

解决方案 »

  1.   

    说白了,串行化就是将内存中的数据保存到永久性存储介质上(比如硬盘),便于以后恢复到内存中再次使用。
    反串行化就是将永久存储介质上的二进制文件恢复成java虚拟机内存可以理解的对象数据。比如你定义了一个如下的类:
    public class Person{
       public String name;
       public String addr;
       public Person(String name,String addr){
            this.name=name;
            this.addr=addr;
       }
    }这是一个类定义文件,你可以将它保存成一个java文件,然后编译成一个class文件,而这个class文件是可以随便拿到任何一个java虚拟机上使用的,但是如下代码:
    public static void main(String[] args){
          Person person=new Person("hello","world");
    }上面的person是一个对象,其中对象的name属性值是hello,addr属性值是world,那么这些数据都保存哪里呢?当然是保存在java虚拟机的内存中的某个地址上,当java虚拟机关闭后,相应的内存也会被清空,那么我想在以后使用这个person对象(注意是使用这个特定的对象,而不是Person类)怎么办?你可能会说,再new一个,并且将相应的属性设置为hello、world不就行了。这样想就错了,现在你知道我对name、addr属性设置的是hello、world值,但是当你不知道我对它设置了什么值的时候,而你就想使用我实例化的这个对象的时候怎么办呢?所以这个时候就我就需要将这个person对象序列化成二进制文件,然后将这个文件通过某种方式发送给你,你接收到这个文件后在你的java虚拟机中通过反序列化将这个person对象在你的虚拟机内存中还原出来,并继续使用,这个时候你就可以调用这个person对象的name属性,并得到我为它赋的hello值了。这就是序列化/反序列化
      

  2.   

    需要串行话的要实现 Serializable
      

  3.   

    只要你理解Java对象的本质就是一个byte序列,只要你拿到byte序列,虚拟机就可以识别这个对象,
    如果你希望这个虚拟机里的对象能被另外一个虚拟机识别,就需要把这个对象的byte序列发送给另外一个虚拟机,
    所以我们才有了序列化和反序列化我们把一个对象转换成byte序列的过程就是序列化
    到了另外一个虚拟机里,我们把这个byte序列重组成一个可以进行方法调用的对象的过程就是反序列化序列化如何进行?简单来说就是把你的class文件里面的内容以byte格式读到一个流中,比如我们读任何class文件的第一个int类型(一个int32位,一个byte8位),十六进制显示你会发现永远都是0XCAFEBABE,因为虚拟机就是靠这个标识来识别加载进来的是不是一个class文件,这个数字来源于一个国外咖啡品牌,也由此Java图标成了一杯咖啡!呵呵,扯一些题外话,希望帮助你理解!