5-4. (2)직렬화(Serialize)

zhyun·2020년 9월 28일
0

HighJava

목록 보기
48/67

Serializable 안된 부모가 있을 경우

부모클래스가 Serializable 인터페이스를 구현하고 있지 않을 경우

  • 부모객체의 필드값 처리 방법
  • 부모클래스가 Serializable 인터페이스를 구현하도록 해야한다.
  • 자식클래스에 writeObject()와 readObject()를 이용하여
    부모객체의 필드값을 처리할 수 있도록 직접 구현한다. T16_NoneSerializableParentTest
    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();
    	}
    }

/**

    1. 직렬화 안된 parent 클래스 (직렬화 대상 아님)
      */
      class Parent { //class Parent implements Serializable

      private String parentName;
      
      public String getParentName() {
      	return parentName;
      }
      
      public void setParentName(String parentName) {
      	this.parentName = parentName;
      }

}
/**

    1. 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)
      
      
profile
HI :)

0개의 댓글