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

 

posted @ 2016-03-09 10:39  maozs  阅读(173)  评论(0编辑  收藏  举报