java串行化技术可以将一个java对象的状态写入byte流(序列化),保持对象的持久化,便于存储和传输;并可以将byte反序列化重构为一个java对象(这个过程不会调用构造器)。这种机制允许你将对象在网络上进行传输,并可以随时把对象持久化到数据库或文件系统中。java的串行机制是RMI\EJB的基础。用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。
1、 要让一个类的对象实例内容能被序列化,首先该类要继承java.io.Serializable.如:
public class Person implements java.io.Serializable{
private String name;
private int age;
public Person (String name, int age){
System.out.println("这是有参数的构造器");
this.name = name;
this.age = age;
}
.......此处省略get、set方法
}
2、用处理流ObjectOutputStream中的writeObject()方法负责将类的实例状态写入输出流,代码如下:
public static void main(String [] args) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("E://object.txt"));
Person p = new Person("牛逼闪闪的青青小丸子", 26);
oos.writeObject(p);
}
3、用ObjectInputStream对象的ReadObject()方法读输入流中的对象,返回一个Object类型,可以强制转换为真正的对象类型,反序列化机制无需通过调用构造器来初始化java对象(因为反序列化Person对象的时候,没有看到程序调用该构造器而执行打印语句)。代码如下:
public static void main(String [] args) throws Exception{
ObjectInputStream oos = new ObjectInputStream( new FileInputStream("E://object.txt"));
Person p = (Person)oos.readObject();
System.out.println(p.getName());
System.out.println(p.getAge());
}
4、声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态,transient代表对象的临时数据;transient关键字修饰Field,可以将该Field完全隔离在序列化之外。特定的情景需要,比如银行账户信息不需要序列化;
5、 WriteObject()和ReadObject()方法可以重写,便于改变序列化和反序列化机制,如在序列化过程中将对象的内容进行加密,反序列化对对象的内容解密。
注意:反序列化读取的仅仅是java对象的数据,而不是java类,因此采用反序列化恢复java对象时候,必须提供java对象所属的class文件,否则会引起ClassNotFoundException异常。