zoukankan      html  css  js  c++  java
  • Java学习-序列化

    参考资料:

    http://www.2cto.com/kf/201405/305380.html

    http://www.cnblogs.com/xdp-gacl/p/3777987.html

     

    1. 序列化和反序列化的概念

      把对象转换为字节序列的过程称为对象的序列化

      把字节序列恢复为对象的过程称为对象的反序列化

      对象的序列化主要有两种用途:

      1 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件或者数据库中;

      2 在网络上传送对象的字节序列。

      在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

      当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

    1. 什么情况下需要序列化 

    • 当你想把的内存中的对象保存到一个文件中或者数据库中时候;
    • 当你想用套接字在网络上传送对象的时候;
    • 当你想通过RMI传输对象的时候;
    1. 如何实现序列化

    将需要序列化的类实现Serializable或者Externalnalizable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。

     

    1. 序列化和反序列化例子

    如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)

    而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。

    /**

    *

    */

    package com.serializable;

     

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.ObjectInputStream;

    import java.io.ObjectOutputStream;

    import java.io.Serializable;

     

    /**

    * @author hugo

    *

    */

    public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name="SheepMu";

    private int age=24;

    public static void main(String[] args)

    {//以下代码实现序列化

    try

    {

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("my.out"));

    //输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流

    Person Person=new Person();

    oos.writeObject(Person);

    oos.flush(); //缓冲流

    oos.close(); //关闭流

    } catch (FileNotFoundException e)

    {

    e.printStackTrace();

    } catch (IOException e)

    {

    e.printStackTrace();

    }

    fan();//调用下面的 反序列化 代码

    }

    public static void fan()//反序列的过程

    {

    ObjectInputStream oin = null;//局部变量必须要初始化

    try

    {

    oin = new ObjectInputStream(new FileInputStream("my.out"));

    } catch (FileNotFoundException e1)

    {

    e1.printStackTrace();

    } catch (IOException e1)

    {

    e1.printStackTrace();

    }

    Person mts = null;

    try {

    mts = (Person ) oin.readObject();//由Object对象向下转型为Person对象

    } catch (ClassNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    System.out.println("name="+mts.name);

    System.out.println("age="+mts.age);

    }

    }

     

     

     

    5、序列化ID

    序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。

     

    6.序列化前和序列化后的对象的关系

    是 "=="还是equal? or 是浅复制还是深复制? 

    答案:深复制,反序列化还原后的对象地址与原来的的地址不同

    序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的"深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。

     

    7.静态变量能否序列化

    序列化会忽略静态变量,即序列化不保存静态变量的状态。静态成员属于类级别的,所以不能序列化。即 序列化的是对象的状态不是类的状态。这里的不能序列化的意思,是序列化信息中不包含这个静态成员域。最上面添加了static后之所以还是输出24是因为该值是JVM加载该类时分配的值。注:transient后的变量也不能序列化

    8、总结:

    a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

    b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

    c) static,transient后的变量不能被序列化;

     

     

  • 相关阅读:
    POJ 1753(1)
    2015.12 杭电校赛 Bitwise Equations
    codeforces B
    POJ2387 水水最短路
    CodeForces 337C SDUT秋季训练--周赛(10.31)
    HDU 1241
    POJ 3126 Prime Path
    HDU 2612
    POJ 1426 Find The Multiple
    day94 flask-session 表单验证 信号 SQLALchemy
  • 原文地址:https://www.cnblogs.com/xuddong/p/5268732.html
Copyright © 2011-2022 走看看