这里了,以一个学生类的例子说明。先上代码:
public class Student implements Serializable {
private int id; // 学号
private String name;// 姓名
private int age;// 年龄
public Student() {
}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
上面的学生类中,添加了相应的封装,重写等方法。下面就要进入测试类对象的序列化:
Student stu=new Student(1, "令狐冲", 24);
//相对路径
String file="test";
//对象序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(stu);
oos.flush();
oos.close();
接着再进行反序列化操作:
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
Student stu1=(Student)ois.readObject();
System.out.println(stu1);
如果不想让某些字段序列化,就可以使用关键字 transient。
当然如果加了transient的字段,还是想给他序列化,那么就可以参照ArrayList的方法进行自己的序列化。这里以学生年龄举例:
private transient int age;// 年龄
...
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();// jvm默认的序列化
s.writeInt(age); // 自己完成序列化
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();// jvm默认的序列化
this.age = s.readInt();// 自己完成序列化
}
在序列化时,如果A是父类,B是子类。对B类进行反序列化操作时。若A没有实现序列化接口,那么父类构造函数就要被显示调用了。