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