public class T16_NoneSerializableParentTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//3.
FileOutputStream fos = new FileOutputStream("d:/D_Other/nonSerializableTest.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos); // 보조스트림(기반스트림 fos)
Child child = new Child();
child.setParentName("부모");
child.setChildName("자식");
oos.writeObject(child);//직렬화
oos.flush();//생략가능
oos.close();
//================================================
FileInputStream fis = new FileInputStream("d:/D_Other/nonSerializableTest.bin");
ObjectInputStream ois = new ObjectInputStream(fis); //보조스트림(기반스트림 fis)
Child child2 = (Child) ois.readObject();//역직렬화
System.out.println("parentName : "+ child2.getParentName()); //null 직렬화대상이 아니어서 기본값
System.out.println("childName : "+child2.getChildName()); //자식
ois.close();
oos.close();
}
}
/**
직렬화 안된 parent 클래스 (직렬화 대상 아님)
*/
class Parent { //class Parent implements Serializable
private String parentName;
public String getParentName() {
return parentName;
}
public void setParentName(String parentName) {
this.parentName = parentName;
}
}
/**
parent 상속받은 child클래스, 직렬화대상
*/
class Child extends Parent implements Serializable{
private String childName;
public String getChildName() {
return childName;
}
public void setChildName(String childName) {
this.childName = childName;
}
/**
* 4.
* 직렬화 될때 자동으로 출력됨
* (접근제어자가 private이 아니S면 자동으로 호출되지 않음)
* @param out
* @throws IOException
*/
private void writeObject(ObjectOutputStream out) throws IOException{
//ObjectOutputStream 객체의 메서드를 이용하여 부모객체의 필드값 처리.
out.writeUTF(getParentName()); //수동으로 처리
out.defaultWriteObject();
}
/**
* 5.
* 역직렬화 될 때 자동으로 호출됨
* (접근 제한자가 private이 아니면 자동호출 되지 않음)
* @param in
* @throws IOException
* @throws ClassNotFoundException
*/
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
setParentName(in.readUTF()); //부모객체 필드값 처리
in.defaultReadObject();
}
}
![](https://velog.velcdn.com/images%2Fzhyun1220%2Fpost%2Fa4814b0b-10f5-4d28-bf13-67f5701c9a4b%2Fimage.png)