序列化流(ObjectOutputStream):将Object对象转换成字节序列,主要方法是writeObject()
反序列化流(ObjectInputStream):将原来序列化好的字节序列转换为Object对象,主要方法是readObject()
对象必须实现序列化接口(serializable)才能进行序列化,此接口无任何方法。若一个类实现了序列化,则其子类都可以进行序列化。
新建一个学生类,该类包含3个学生的基本属性、一个无参的构造方法、一个3个参数的构造、属性的getter/setter方法和toString方法。
public class Student implements Serializable{
private String stuno;
private String stuname;
private int stuage;
public Student(){}
public Student(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 "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
}
对该类进行序列化和反序列化。序列化时要实例化对象,通过序列化流的writeObject方法写入对象;反序列化时,通过反序列化流的readObject方法读出,并强制转换成原类型。代码如下所示。
public class ObjectSeriaDemo {
public static void main(String[] args)throws Exception {
String file = "demo/obj.dat";
//对象的序列化
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(file));
Student stu = new Student("10001","张三",20);
oos.writeObject(stu);
oos.flush();
oos.close();
//对象的反序列化
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(file));
Student s = (Student)ois.readObject();
System.out.println(s);
ois.close();
}
}
transient关键字修饰的元素不会进行默认的序列化(反序列化)操作,但可以通过自己完成元素的序列化(反序列化)。
上例中的学生类,若对年龄属性stuage用transient关键字进行修饰,执行序列化流程序后,学生年龄就不会进行默认的序列化,打印出来学生年龄的结果为int类型默认值0。如果需要单独对其进行序列化和反序列化操作,则需要在Student类中加入以下代码。
//注意是private修饰符
private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{
s.defaultWriteObject();//先把能默认序列化的元素进行序列化操作
s.writeInt(stuage);//自己完成序列化操作
}
private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{
s.defaultReadObject();//先把能默认反序列化的元素进行反序列化
this.stuage = s.readInt();//自己完成反序列化操作
}
注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!