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();
}
}