Java之Serializable

1:AbstractSerializeDemo.java

class AbstractSerializeDemo{
	protected int x, y;

	public void init(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	public void printXY() {
		System.out.println("x:" + x + ";y:" + y);
	}
}

2:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;

import org.junit.Test;

public class SerializeDemo extends AbstractSerializeDemo implements Serializable {
	private int z;
	//註解在javeee.jar包中
	//@Transient 不被序列化
	private int tranziant;

	public SerializeDemo() {
		super.init(10, 50);
		z = 100;
	}

	public void printZ() {
		super.printXY();
		System.out.println("z:" + z);
	}
	
	@Override
	public String toString() {
		return "x: " + x + "  y: " + y + "  z: " + z;
	}

	/**
	 * (如果父類不繼承Serializable,則輸出如下信息:x:10;y:50 z:100 
	 *                                  否則輸出: x:0;y:0 z:100
	 * 亦可以讓SerializeDemo重寫writeObject和readObject方法)
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream out = new ObjectOutputStream(bos);
		SerializeDemo sd = new SerializeDemo();
		System.out.println("調用toString()打印對象的值");
		sd.printZ();//x:10;y:50 z:100 
		out.writeObject(sd);
		ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
		SerializeDemo sd2 = (SerializeDemo) in.readObject();
		System.out.println("反序列化打印對象的值"); //此時只序列化了SerializeDemo,其父類的沒有序列化
		//x:0;y:0 z:100 如果重寫了SerializeDemo的writeobject和readobject方法,或父類繼承接口Serializable,則輸出x:10;y:50 z:100
		sd2.printZ();
	}
	
	private void writeObject(ObjectOutputStream os) throws IOException {
		// java對象序列化默認操作
		os.defaultWriteObject();
		os.writeInt(getX());
		os.writeInt(getY());
	}

	private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
		is.defaultReadObject();// java對象反序列化默認操作
		int x = is.readInt();
		int y = is.readInt();
		super.init(x, y);
	}
	/**
	 * 寫入文件並讀取
	 */
	@Test
	public void writeToFile() throws IOException, ClassNotFoundException {
		File file1 = new File("testFile");
		OutputStream os = new FileOutputStream(file1);
		ObjectOutputStream oos = new ObjectOutputStream(os);
		SerializeDemo demoObj = new SerializeDemo();
		oos.writeObject(demoObj);
		oos.flush();
		oos.close();
		os.close();

		File file2 = new File("testFile");
		InputStream is = new FileInputStream(file2);
		ObjectInputStream ois = new ObjectInputStream(is);
		SerializeDemo sd = (SerializeDemo) ois.readObject();
		System.out.println(sd);
		ois.close();
		is.close();
	}

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章