一直对java中的序列化原理比较模糊,今天找点资料好好学习一下:
序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。 例如:hibernate中实体类的钝化就是将类序列化后存入磁盘并释放内存空间。
将要序列化的对象实现Serializable接口,Serializable接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。例子:
import java.io.*;
public class Test {
public static void main(String[] args) {
Employee harry = new Employee("Harry Hacker", 50000);
Manager manager1 = new Manager("Tony Tester", 80000);
manager1.setSecretary(harry);
Employee[] staff = new Employee[2];
staff[0] = harry;
staff[1] = manager1;
try {
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("employee.dat"));
out.writeObject(staff);
out.close();
ObjectInputStream in = new ObjectInputStream( new FileInputStream("employee.dat"));
Employee[] newStaff = (Employee[])in.readObject();
in.close();
/**
*通过harry对象来加薪
*将在secretary上反映出来
*/
newStaff[0].raiseSalary(10);
for (int i = 0; i < newStaff.length; i++) System.out.println(newStaff[i]); } catch (Exception e) { e.printStackTrace(); } } }#p# class Employee implements Serializable{ public Employee(String n, double s) { name = n; salary = s; } /** *加薪水 */ public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } public String toString() { return getClass().getName() + "[name = "+ name + ",salary = "+ salary + "]"; } private String name; private double salary;}class Manager extends Employee{ public Manager(String n, double s) { super(n, s); secretary = null; } /** *设置秘书 */ public void setSecretary(Employee s) { secretary = s; } public String toString() { return super.toString() + "[secretary = "+ secretary + "]"; } //secretary代表秘书 private Employee secretary; }
为什么Java在网络传输对象时,如采用RMI时,被传输的对象都必须进行序列化实现。
对象就是数据和方法的一个组合体,对象的数据类型比较抽象,直接网络传输肯定不会像传个Integer类型那么容易,得把比较抽象的对象转换成基本的数据类型(比如说字符串,数字,boolean等)才好传输..序列化就是数据转换的一种方式(它应该把对象转换成字符串了,字符串具体描述了对象的一切信息..根据我php编程的经验),字符串传输,问题肯定不大....