java序列化与反序列化
在java中,对象通常都是在程序运行时创建,程序退出后对象也就消失了。在许多情况下,我们需要将对象保存,方便下次再用,或者是用于网络传播,这里就需要用到序列化和反序列化了。
序列化:简单来讲就是将对象转化为字节序列。
反序列化:就是将字节序列重新转化为对象。
而想要将对象序列化,需要它的类实现Serializable接口。
例如我们要将一个人的信息进行序列化:
public class Person implements Serializable {
private int id;
private String name;
private String gender;
public Person(int id, String name, String gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
下面序列化的简单实例:
public static void serialize() throws FileNotFoundException, IOException {
File file = new File("person.dat");
Person person = new Person(99, "xiaoming", "male");
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(person);
oos.flush();
oos.close();
}
对序列化文件进行反序列化:
public static void deSerialize() throws FileNotFoundException, IOException, ClassNotFoundException {
File file = new File("person.dat");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Person person = (Person) ois.readObject();
System.out.println(person);//输出:Person [id=99, name=xiaoming, gender=male]
}
很多时候,我们并不需要将对象中的所有成员全部序列化,而只是序列化其中的一部分。
在这种情况下,我们可以使用transient关键字来修饰不想要序列化的成员。
比如,在上面的例子中,我们不想要性别gender这个成员进行序列化,我们可以这样:
private transient String gender;
如此,在序列化时就会跳过gender,不对其进行序列化。
我们也可以通过writeObject,readObject方法将transient修饰的成员进行序列化,
private void writeObject(ObjectOutputStream oos) throws IOException{
oos.defaultWriteObject();
oos.writeObject(gender);
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException{
ois.defaultReadObject();
gender=(String) ois.readObject();
}
其中oos.defaultWriteObject();ois.defaultReadObject();两条语句分别为将默认可序列化的成员进行序列化和反序列化

浙公网安备 33010602011771号