序列化和反序列化(三)——父類的序列化

1、一個父類實現序列化,子類自動實現序列化;

      示例:

package com.jd.vo;

import java.io.Serializable;

public class Father implements Serializable{

	private static final long serialVersionUID = 6614009233928674796L;
	public int age;
}
package com.jd.vo;

public class Son extends Father {

	private static final long serialVersionUID = -7604257792005206061L;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
package com.jd.test;

import java.io.*;

import com.jd.vo.Son;

public class Test {

	/**
	 * 序列化
	 * 
	 * @author GaoHuanjie
	 */
	public static void serialize() {
		Son son = new Son();
		son.age = 12;
		son.setName("Tom");
		System.out.println(son);
		ObjectOutput objectOutput = null;
		try {
			objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
			objectOutput.writeObject(son);
			objectOutput.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (objectOutput != null) {
				try {
					objectOutput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 反序列化
	 * 
	 * @author GaoHuanjie
	 */
	public static void deserialize() {
		ObjectInput objectInput = null;
		try {
			objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
			Son son = (Son) objectInput.readObject();
			System.out.println(son.age);//輸出12 age屬性是Son類從Father類繼承過來的,由於父類實現Serializable接口,所以序列化子類時age屬性也會被序列化。
			System.out.println(son.getName());//輸出Tom 儘管Son類沒有實現Serializable接口,但由於其父類實現了該接口,所以Son類中name屬性依然被序列化。
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (objectInput != null) {
				try {
					objectInput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		serialize();// 序列化
		deserialize();// 反序列化
	}
}

2、子類實現序列化,父類沒有實現,則子類繼承父類的屬性在序列化子類時不會被序列化;

      示例:

package com.jd.vo;

public class Father{

	public int age;
}
package com.jd.vo;

import java.io.Serializable;

public class Son extends Father implements Serializable {

	private static final long serialVersionUID = -7604257792005206061L;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
package com.jd.test;

import java.io.*;

import com.jd.vo.Son;

public class Test {

	/**
	 * 序列化
	 * 
	 * @author GaoHuanjie
	 */
	public static void serialize() {
		Son son = new Son();
		son.age = 12;
		son.setName("Tom");
		System.out.println(son);
		ObjectOutput objectOutput = null;
		try {
			objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
			objectOutput.writeObject(son);
			objectOutput.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (objectOutput != null) {
				try {
					objectOutput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 反序列化
	 * 
	 * @author GaoHuanjie
	 */
	public static void deserialize() {
		ObjectInput objectInput = null;
		try {
			objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
			Son son = (Son) objectInput.readObject();
			System.out.println(son.age);//age屬性是Son類從Father類繼承過來的,但由於父類沒有實現Serializable接口,所以序列化子類時age屬性並不會被序列化。
			System.out.println(son.getName());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (objectInput != null) {
				try {
					objectInput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		serialize();// 序列化
		deserialize();// 反序列化
	}
}

3、子類實現序列化,父類沒有實現,則父類必須提供無參構造方法;

      例子:

package com.jd.vo;

public class Father{

	public int age;
	
	public Father() {//該無參構造方法不可省略,否則出現“java.io.InvalidClassException: com.jd.vo.
Son; no valid constructor”異常
		
	}
	public Father(int age) {
		this.age = age;
	}
}
package com.jd.vo;

import java.io.Serializable;

public class Son extends Father  implements Serializable{

	private static final long serialVersionUID = -7604257792005206061L;
	
	public Son(int age) {
		super(age);
		this.age = age;
	}
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
package com.jd.test;

import java.io.*;

import com.jd.vo.Son;

public class Test {

	public static void main(String[] args) throws Exception {
		try {
			// 序列化
			ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream("D:\\son.ser"));
			Son son = new Son(12);
			son.setName("Tom");
			System.out.println(son);
			objectOutput.writeObject(son);
			objectOutput.flush();
			objectOutput.close();

			// 反序列化
			ObjectInput objectInput = new ObjectInputStream(new FileInputStream("D:\\son.ser"));
			son = (Son) objectInput.readObject();
			objectInput.close();
			System.out.println(son.age);
			System.out.println(son.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

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