(1)对象的序列化就是将Object装换成byte序列,反之叫对象的反序列化。
(2)序列化流(objectOutputStream),是字节过滤流,主要方法是writeobject()方法;反序列化流(objectInputStream),主要方法是readObject()方法。
(3)序列化接口(serializable): 对象必须实现序列化接口,才能进行序列化,否则将会出现异常。这个接口,没有任何方法,只是一个标准。
(4)用transient关键字标记的成员变量不参与序列化过程
(5)序列化中子类和父类构造函数的调用问题
1)一个类实现了序列化接口,那么其子类都可以进行序列化;
2)对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用。如果父类实现了序列化接口,那么其父类的构造函数不会被调用。
(6)下面这个是对象序列化和反序列化的一个简单例子,以及使用transient关键字的实验代码,也可以将transient关键字去掉运行进行对比查看
import java.io.Serializable;
public class SeriaStudent implements Serializable{
private String stuno;
private String stuname;
private transient int stuage;//该元素不会进行虚拟机默认的序列化,也可以自己完成这个元素的序列化
public SeriaStudent(){
}
public SeriaStudent(String stuno, String stuname, int stuage) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.stuage = stuage;
}
public String getStuno() {
return stuno;
}
public void setStuno(String stuno) {
this.stuno = stuno;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
@Override
public String toString() {
return "ListStudent [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
}
//可以使用下面这两个方法自己完成被transient修饰的对象的序列化
/*private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{
s.defaultWriteObject();//把虚拟机能默认的序列化的元素进行序列化操作s.writeInt(stuage); //自己完成stuage的序列化
}
private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{
s.defaultReadObject(); //把虚拟机能默认反序列化的元素进行反序列化操作
this.stuage=s.readInt();//自己完成stuage的反序列化操作
}*/
}
以下程序先运行序列化程序,再将序列化程序注释后运行反序列化程序。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectSeriaDemo {
public static void main(String[] args) throws Exception {String file="demo/obj.dat";
//1.对象的序列化
/*ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
SeriaStudent stu=new SeriaStudent("1001","张三",20);
oos.writeObject(stu);
oos.flush();
oos.close();*/
//2.对象的反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
SeriaStudent stu=(SeriaStudent)ois.readObject();//强制类型转化
System.out.println(stu);
ois.close();
}
}
age成员变量没有transient修饰时的运行结果
age成员变量有transient修饰时的运行结果
age成员变量有transient修饰,但是有
private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{
}
private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{}
这两个方法的运行结果