java序列化深入研究

来源:互联网 发布:matlab 最优化 pdf 编辑:程序博客网 时间:2024/04/29 23:43

1.什么是序列化?

      简单的说就是为了保存各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象再读出来的过程。对象序列化就是把对象写入到输出流中,用来存储或传输。

 

2.序列化都保存了些什么?

      a.对象的类型。

      b.对象属性的类型。

      c.对象属性的值。

 

3.什么情况下需要序列化?

      a.当你想把对象的状态保存到一个文件中或者数据库中的时候。

      b.当你想用套接字在网络上传输对象的时候。

      c.当你想通过RMI传输对象的时候。

 

4.举例说明

      Java代码:

***************************************************

package com.gyb.serializable;

 

import java.io.Serializable;

 

public class DomainObject implements Serializable {

    public String name;

    public int age;

 

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
       return "This is a serializable test!";
    }

}

****************************************************

package com.gyb.serializable;

 

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

 

public class WriteObjectTestDemo {
    public static void main(String args[]) {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            DomainObject obj = new DomainObject();

            obj.setName("gyb");

            obj.setAge(24);

            fos = new FileOutputStream("d:/temp");
            oos = new ObjectOutputStream(fos);
            oos.writeObject(obj);
            oos.close();
            fos.close();
       } catch (FileNotFoundException e) {
            e.printStackTrace();
       } catch (IOException e) {
            e.printStackTrace();
       }
   }
}
**********************************************

package com.gyb.serializable;

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

 

public class ReadObjectTestDemo {
    public static void main(String args[]) {
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try {
            fis = new FileInputStream("d:/temp");
            ois = new ObjectInputStream(fis);
            DomainObject obj = (DomainObject) ois.readObject();
            System.out.println("name = " + obj.getName());
            System.out.println("age = " + obj.getAge());
            ois.close();
            fis.close();
       } catch (FileNotFoundException e) {
            e.printStackTrace();
       } catch (IOException e) {
            e.printStackTrace();
       } catch (ClassNotFoundException e) {
            e.printStackTrace();
       }
   }
}
************************************************

结果会在D盘下生成一个temp对象文件,用一个支持二进制的编辑器工具打开后内容如下:

com.gyb.serializable.DomainObject
ageL
namet
Ljava/lang/String;xp
gyb

我们可以用对象反序列化从输入流中读出这个对象,ReadObjectTestDemo 类的执行结果为:

name = gyb

age = 24  

 

5.注意事项

    a.序列化时只对对象的状态进行保存,而不管对象的方法。

    b.当一个父类实现序列化,子类自动实现序列化,不需要再显式实现Serializable接口。

    c.当一个对象的实例变量引用了其它对象,序列化该对象时其它引用对象也被进行了序列化。

    d.并非所有的对象都可以序列化,有很多原因导致不可以。比如:

          1.安全方面的原因:比如一个对象拥有private,public等属性,若对这个对象进行写入文件或者rmi传输,在序列化进行传输的的过程中,这个对象的private属性是不受保护的。

          2.资源分配方面的原因:比如socket,thread,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且也没有必要这样去实现。

原创粉丝点击