brunch

You can make anything
by writing

C.S.Lewis

by 김선우 May 09. 2016

직렬화, 역직렬화

직렬화란 무엇인가..?

객체를 바이트의 배열로 변환해서 파일, 메모리, 디비 등 저장하는 과정. 

반대를 역직렬화라고 말을 한다.


serialVersionUID 를 통하여 버전을 체크한다 ( 유니크한 클래스라는 것을 증명하는 아이디 정도?)

작성하지않으면 내부적으로 자동으로 작성을 하는데 JVM에 따라 달라지게 된다.


마샬링과의 차이점

원격 프로시저 호출이라는 맥락에서는 비슷하나, 

마샬링은 인자(parameter)를 전달하는 작업이고 직렬화는 원시형 타입(primitive type)에서 바이트 스트림과 같은 형식을 복사를 하는 작업이다. 마샬링의 pass-by-value 개념을 구현하는 수단이라고 볼 수 있다. 


그렇다면 

pass-by-value 란 무엇인가..?

말그대로 값의 전달이다. 자바에서 모든 값넘김은 pass-by-value다. 

객체의 경우 pass-by-reference 라고 오해할 수 있으나, 참조값의 복사본을 pass-by-value 로 넘긴다.

아래의 코드를 보면 쉽게 이해할 수 있다.


public static void main(String[] args) {
    Integer a, b;
    a = new Integer(10);
    b = new Integer(30);
    System.out.println("before swap...");
    System.out.println("a is " + a);     // 10
    System.out.println("b is " + b);    // 30
    System.out.println("");
    swap(a, b);

    System.out.println("after swap...");
    System.out.println("a is " + a);    // 10
    System.out.println("b is " + b);   // 30
}

public static void swap(Integer a, Integer b) {
    Integer temp = a;
    a = b;
    b = temp;
    System.out.println("객체의 참조값을 복사하여 넘긴 후...");
    System.out.println("a is "+a);    // 30
    System.out.println("b is "+b);   // 10
    System.out.println("");
}

원리는 이렇다. main 메서드의 참조(객체) a, b 는 swap 메서드의 변수 a, b 로 복사가 된다.

호출받은 swap 메서드는 두 참조가 공유하는 객체(복사된 값)를 변경한다. 

메서드가 종료되면 변수 a, b 는 유효범위를 벗어나게 된다. -> main 메서드의 a, b 값의 변경은 없다.



이미지 출처 : http://blog.naver.com/PostView.nhn?blogId=kkson50&logNo=220564273220&parentCategoryNo=&categoryNo=33&viewDate=&isShowPopularPosts=false&from=postView

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari