对象序列化
对象序列化主要有两种作用
1, 使用序列化保存对象状态保文件中,当需要时从文件中读出重构状态
web服务器中的Session对象就是很需要序列化的对象,当用户访问量很大时,session对象也不断增多,如果session全部保存在内存中,内存可能负载很大,这时就需要将一小部分生存周期还存在的session存入硬盘,当用户再登录时,就可将seeion对象反序列化,从而继续使用
2, 使用序列化保存对象状态保文件中,当需要时从文件中读出重构状态
使用序列化在网络中传送对象
网络传输中都是以二进制序列的方式传输,当要传输一个类对象时,需要将类对象一字节流的形式进行传输
若要将类对象序列化,则需要将类实现 java.io.Serlializablej接口
序列化包含两部分
一个是序列化,另一个是反序列化。ObjectOutputStream 的 WriteObject()方法负责将对象序列化保存到文件中,而ObjectInputStream的ReadObject()则负责将对象从文件中反序列化过来进行重构。
我们来看下以下一段代码
import java.io.*; public class TestSerializable { public static void main(String[] args) { Employee em = new Employee("tom",5000); Manager mr = new Manager("kimo",80000); mr.setSectary(em); Employee[] ems = new Employee[2]; ems[0]=em; ems[1]=mr; try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(".\\test.txt")); oos.writeObject(ems); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(".\\test.txt")); Employee[] staff=(Employee[])ois.readObject(); ois.close(); staff[0].addSalary(20); for(int i=0;i<staff.length;i++) { System.out.println(staff[i]); } } catch (Exception e) { e.printStackTrace(); } } } class Employee implements Serializable{ //private String age; String name; double salary; public Employee(String name,double salary) { this.name = name; this.salary = salary; } public void addSalary(double percent) { double raise=salary*percent/100; salary += raise; } public String toString() { return this.getClass().getName()+"["+"name:"+name+"salary:"+salary+"]"; } } class Manager extends Employee { private Employee sectary; public Manager(String name,double salary) { super(name,salary); sectary=null; } public void setSectary(Employee sectary) { this.sectary = sectary; } public String toString() { return this.getClass().getName()+"["+"name:"+super.name+"salary:"+super.salary+"sectary:"+this.sectary+"]"; } }
结果如下:成功读取对象在文件中保存的状态
当然 大家如果想类的某个成员变量不被序列化,可在其前添加transient关键字,这样这个属性所对应的对象状态不会被序列化,更不可能被恢复.
讲的很浅,以后深入后会慢慢补充。。。。