- 자바 객채를 저장하거나 전송하기 위해서 자바 객체의 코드를 다시 복원가능한 형태의 Stream 으로 변경(?) 직렬화 시켜주는 것
  - 용어 설명
    * 직렬화 : Heap 에 위치한 객체를 출력 가능한 상태로 만드는 작업
    * 역직렬화 : 직렬화된 객체를 다시 Heap 에 넣기 위한 작업
    * 직렬화의 대상은 객체의 Attribute 의 값 (메소드는 그저 주소값만 필요) - Attribute 만 직렬화된단 말씀
    * 객체를 IO 하기 위해서는 필터 스트림인 ObjectInputStream & ObjectOutputStream 이 필요하다
    * 직렬화할 대상객치는 java.io.Serializable 를 implements 한 클래스(객체) 이어야 한다.


    EX) 직렬화 대상 클래스
    import java.io.*

    public class Member implements Serializable {
        private String name;
        private String address;
        private String hobby;
        private transient int age;  // 객체 Instance 앞에 transient 키워드를 붙여주면 직렬화 대상에서 제외 된다.
    }
   
    EX) 객체 직렬화 하기
    public void writeMenberObject(Member m) throws IOException {
        ObjectOutputStream oos = null;
 try {
     oos = new ObjectOutPutStream(new FileOutputStream("mem.obj") );  // 연결 + 필터 추가
     oos.writeObject(m);  // 객체를 출력하는 메소드 : writeObject(Object obj)
     // write 할때 Exception 이 발생하는데 이 때 close 를 안하면 스트림이 안닫혀 있는 상태로
 } fimally {
     if( oos != null ) {
             oos.close();  // close 해줌
          }
       }
    }

 

    EX) 역직렬화 된 객체를 복원하기
    public Member readMemberObject() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = null;
 Member m = null;
 try {
     ois = new ObjectInputStream(new FileInputStream("mem.obj") );
     m = (Member)ois.readObject();
 }finally {
         ois.close();
         return m;
         }
      }

 

  - 직렬화 대상 클래스 EX) 중에 인스턴스 변수명 앞에 "transient" -> 객체 직렬화 피하기!
    * 보안적인 측면에서 직렬화 할때 빼는 경우
    * 직렬화 대상이 아닌 객체의 Type
      - 예제를 보기전에 설명을 하자면 직렬화할 클래스에 implements Serializable 를 붙였다.

         Ex) Class Woochul implements Serialzable
        'Ex)' 의 'Woochul' class 에 다른 객체(Serialzable 안한 class)의 멤버 인스턴스를 가지고 있다면, 직렬화가 되지 않는다.
              이때도, transient 를 사용해서 제외시킨다.(코드를 수정하지 않아도 되는 이점이 있다고 한다.)

        EX) 객체 직렬화 피하기
 Class Woochul implements Serialzable{
     Ssung ssung = new Ssung(); -> transient Ssung ssung = new Ssung();  // 객체 직렬화 피하기
 }

 Class Ssung {
     ....
 }

 

  - 부록
    역직렬화해서 만든 객체(readObject() 메소드로 불러온 객체)의 클래스가 변경 되었을떄
    JVM 은 역직렬화 객체를 대입할수 없다고 예외를 발생 시킨다.
    직렬화, 역직렬화 할때 JVM 이 serialVersionUID 를 부여하는데 역직렬화해서 만든 객체의 클래스가 변경될때 이 값

    (serivalVersionUID) 변경이 되어 서로 일치하지 않아서 발생하는 현상이다.
    이를 해결하기 위해서 새로변경된 클래스와 역직렬화 하는 객체의 serialVersionUID 를 일치시켜주어야 한다.


    참고사이트 ->    #####  http://dojeun.egloos.com/317825   #######

'공부 > JAVA' 카테고리의 다른 글

JAVA_[Vector]  (0) 2012.07.31
JAVA_[Thread]  (0) 2012.06.23
JAVA_[Adapter_패턴 (일명 : Wrapper 패턴)]  (0) 2012.06.23
JAVA_[Eclipse_SerialVersionUID]  (0) 2012.06.23
JAVA_[코딩_지침]  (0) 2012.06.21

+ Recent posts