`

[java][io][Serialize]对象序列化,Externalizable

阅读更多

import java.io.EOFException;
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;

/**
 * 
 * Externalizable接口继承于Serializable,并有writeExternal()和readExternal()方法.
 * 这两个方法在序列化和反序列化时被调用.
 * Externalizable接口的子类在反序列化时需要调用默认构造,因此其子类构造的权限必须为public.
 * 
 */
public class ExternalizeDemo {

	public static void main(String[] args)  {
		Ext1 e1 = new Ext1();
		Ext2 e2 = new Ext2(5);
		String filePath = "d:\\e.txt";
		try{
			serialize(filePath, e1, e2);
			deserialize(filePath);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	//序列化
	static void serialize(Object obj, String filePath) throws Exception{
		FileOutputStream file = new FileOutputStream(filePath);
		ObjectOutputStream out = new ObjectOutputStream(file);
		out.writeObject(obj);
		out.close();
		System.out.println("serialize end.");
	}
	
	//序列化
	static void serialize(String filePath, Object... objs ) throws Exception{
		FileOutputStream file = new FileOutputStream(filePath);
		ObjectOutputStream out = new ObjectOutputStream(file);
		for(Object obj : objs){
			out.writeObject(obj);
		}
		out.close();
		System.out.println("serialize end.");
	}
	
	//反序列化
	static void deserialize(String filePath) throws Exception{
		FileInputStream file = new FileInputStream(filePath);
		ObjectInputStream in = new ObjectInputStream(file);
		Object obj = null;
		try {
			while((obj=in.readObject()) != null){
				System.out.println(obj.toString());
			}
		} catch (EOFException e) {
			//
		}
		
		in.close();
	}

	static class Ext1 implements Externalizable {

		//public构造
		public Ext1() {
			System.out.println("Ext1...");
		}

		public void writeExternal(ObjectOutput out) throws IOException {
			System.out.println("writeExternal...");
		}

		public void readExternal(ObjectInput in) throws IOException,
				ClassNotFoundException {
			System.out.println("readExternal...");
		}

	}

	static class Ext2 implements Externalizable {

		private int i;
		
		public Ext2() {
			System.out.println("Ext2...");
		}
		
		public Ext2(int i){
			System.out.println("Ext2(int i)...");
			this.i = i;
		}

		public void writeExternal(ObjectOutput out) throws IOException {
			System.out.println("writeExternal2...");
			out.writeInt(i);//如果不这样做,反序列化后得到的是0,而不是序列化时的值
		}

		public void readExternal(ObjectInput in) throws IOException,
				ClassNotFoundException {
			System.out.println("readExternal2...");
			i = in.readInt();//如果不这样做,反序列化后得到的是0,而不是序列化时的值
		}
		
		public String toString(){
			return Integer.toString(i);
		}

	}

}

/*
Ext1...
Ext2(int i)...
writeExternal...
writeExternal2...
serialize end.
Ext1...
readExternal...
com.mycom.serial.ExternalizeDemo$Ext1@173a10f
Ext2...
readExternal2...
5


*/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics