在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();两条语句分别为将默认可序列化的成员进行序列化和反序列化