교육과정 기록/☕ Java

[4.20] 객체의 직렬화 (Serialization) / 역직렬화

춘식이왔엉 2022. 4. 20. 21:35

* 객체의 직렬화 

* 객체의 역직렬화

 

* local class incompatible: 

   stream classdesc serialVersionUID = -5993977944878930441, 
   local class serialVersionUID          = -1265691405514514962


   ClassC 타입의 객체를 파일에 직렬화 할 당시의, ClassC의 serialVersionUID 값은
             "-5993977944878930441" 이었는데, 이후에 field2 를 ClassC에 추가하고 재 컴파일 한 후의
             ClassC 안에 serialVersionUID 값은 "-1265691405514514962"이다. 


 

* 상속 관계일 때의 직렬화

1. 부모/자식 모두 Serializable 하면, 

   * 자식객체를 직렬화 할 때 ===> 자식만이 아니라, 부모객체까지 함께 직렬화된다!!!! (기본 직렬화 동작)

2. 부모만 Serializable 하고,
   자식은 Non-serializable 할 때,

   * 자식 객체를 직렬화 하면 ===> 위 1과 동일하다!!! (***)
   * 즉, 부모의 Serializable 한 성질이 자식에게도 상속됩니다 (*******)

3. 부모만 Non-Serializable 하고,
   자식은 Serializable 할 때,

   * 자식 객체를 직렬화 하면 ===> 자식객체만 직렬화 된다~!!!!! (위 1,2와 다른 결과)

4. 부모만 Non-Serializable 하고,
   자식은 Non-Serializable 할 때,

   * 자식 객체를 직렬화 하면 ===> 무조건 오류발생!!!

5. 부모만 Non-Serializable 하고, 부모소스는 다른 벤더에서 만큰 클래스가 소스의 수정불가!
   자식은 Serializable 할 때, (이 케이스가 실무 면접 시, 객체 직렬화의 핵심 질문임!)

   * 어떻게 하면, 자식/부모 모두 객체의 직렬화를 가능하게 할까!? ===> 방법을 알자!!!! (***)

   * 자식 클래스에 아래의 2개의 메소드를 추가하고, 이 메소드 안에서,
     직렬화/역직렬화가 애시당초 불가능한 필드에 대해서는, InputStream/OutputStream이 제공하는
     메소드로 직접 입/출력을 수행하고, 나머지 Serializable 한 필드는 JVM이 하듯이 동일하게 처리하자!!!

     private void writeObject(ObjectOutputStream out) throws IOException { ... }
     private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { ... }

*Parent

 

*Child

  

*실행