J2SE(八)Java之对象的序列化与反序列化

什么是序列化与反序列化

序列化是java提供的一种保存对象状态的机制(指实例变量,非方法),将对象转换为字节序列,可以对字节序列进行读写操作。

将字符序列恢复为对象的过程称之为反序列化。

什么情况下使用序列化

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;

注意点:

a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。

序列化API:

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

package com.review.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class People implements Serializable {

	private static final long serialVersionUID = -4482502256611631833L;

	private int age;

	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "People [age=" + age + ", name=" + name + "]";
	}

  	// 序列化
	public static void serializable(People p) throws IOException {
		FileOutputStream fos = new FileOutputStream("people.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(p);
		oos.close();
		fos.close();
	}

	// 反序列化
	public static void deserializable() throws IOException, ClassNotFoundException {
		FileInputStream fis = new FileInputStream("people.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		People p = (People) ois.readObject();
		System.out.println(p.toString());
		ois.close();
		fis.close();
	}

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		People p=new People();
		p.setAge(17);
		p.setName("xxx");
		serializable(p);
		deserializable();
	}

}


你可能感兴趣的:(J2SE)