比较java.io.Externalizable和java.io.Serializable

http://soft.zdnet.com.cn/software_zone/2009/0204/1332403.shtml
即使你没有用过对象序列化(serialization),你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化,外部化(externalization)?

下面是序列化和外部化在代码级的关联方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
  void readExternal(ObjectInput in);
  void writeExternal(ObjectOutput out);
}

序列化和外部化的主要区别

外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。

通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

现在如何实现readExternal() 和writeExternal() 就完全看你自己了。

序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。

每个接口的优点和缺点

Serializable接口

·         优点:内建支持

·         优点:易于实现

·         缺点:占用空间过大

·         缺点:由于额外的开销导致速度变比较慢

Externalizable接口

·         优点:开销较少(程序员决定存储什么)

·         优点:可能的速度提升

·         缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。

在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。

要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:

private void writeObject()
private void readObject()
下面是Externalizable的一个example
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class AppTest {
	private void saveGame(){
		Person m = new Person("北京","cdq",34);
		if (m != null){
			try{
				FileOutputStream ostream = new FileOutputStream(System.getProperty("user.dir")+"/t.txt");
				ObjectOutputStream p = new ObjectOutputStream(ostream);

				p.writeObject(m); //writeExternal()自动执行

				p.flush();
				ostream.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}

	private void loadGame(){
		try{
			FileInputStream instream = new FileInputStream("t.txt");
			ObjectInputStream p = new ObjectInputStream(instream);
			Person m = (Person)p.readObject();//readExternal()自动执行

			m.output();
			instream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new AppTest().saveGame();
		new AppTest().loadGame();

	}


}

class Person implements Externalizable
{
	private String address;
	private String name;

	private int num;
	
	public Person()
	{
		
	}
	public Person(String address,String name,int num)
	{
		this.address = address;
		this.name=name;
		this.num=num;
	}
	public void readExternal(ObjectInput in) throws IOException,
	ClassNotFoundException {
		address = (String)in.readObject();
		num = in.read();
		//name = (String)in.readObject();没有写入就不能读取不然会抛出OptionalDataException异常
	}

	public void writeExternal(ObjectOutput out) throws IOException {

		out.writeObject(address);
		//只序列化address
		out.write(88);
	}	

	public void output()
	{
		System.out.println("address="+address+",num="+num+",name="+name);
	}

}

你可能感兴趣的:(java,工作,虚拟机)