Java

직렬화(serialization) 에 대한 짧은 이야기 (Q/A)

[하마] 이승현 (wowlsh93@gmail.com) 2015. 7. 7. 11:15

 

1. serialize(직렬화) 란?  

 -> 메모리안의 어떠한 (추상적) 데이터구조를 연속된  bit  로  외부에 보내기위해 정렬하는것.


 2.  왜 직렬화를 해야하나? 

 -> 물리층 자체가  bit 니깐  /  가장 베이스적인 약속으로서 활용


 3. 위에서 외부란 ?

 -> 파일 / DB / 소켓을 통해 네트워크 외부등

 

4. 직렬화의 종류는 ?

 -> 데이터를 어떤식으로 구조화하냐에 따라서 달라짐. 예) 자바직렬화, 구글 프로토콜버퍼

 -> 프로토콜버퍼등은 데이터를 짧고 효율적이게 하는게 주목적.반면 자바직렬화는 낭비가 엄청남


5. 직렬화를 활용하는곳? 

-> 소켓통신, 자바객체를 파일에 저장 ( 파워포인트등의 내용을  파일(ppt) 로 저장할때도 객체직렬화)


6. 직렬화 예제  

다음은 int 형을 바이트배열로 직렬화하는 코드에요

C++ ) 

       inline static string intDATA(int  nData)
	{
		string value;
		value.clear();
		value.append("i");
		value.append((const char *)&nData, sizeof(nData));

		return value;
	}

        ...
        byte[] b = value.c_str();

nData 라는 int 형을 직렬화하는데, 일단 제일 앞에 1바이트로 "i" 문자열을 넣습니다.

그리고 int 형 데이터를 넣습니다. 나중에 저 string 에서  바이트배열로 뽑아내서 리모트로 보내면 

상대방은  1바이트를 읽어서  "i"  면  다음에 올 배열을  int 형으로 만들수있게 됩니다.  :-)

"d" 라면 다음에 올 바이트배열로 double 형을 만들어야할테지요.


Java )

ObjectOutputStream  out = new ObjectOutputStream(...);
out.writeInt(10);

 out 이라는 객체에 10이라는 int 형을 배열로 담고 있습니다.

 마찬가지로 double 형이라면 writeDouble 으로~


  writeInt 메소드의 내부에는 이렇게 되어있네요.


  public final synchronized void writeInt (int value) throws IOException
  {
      write ((byte) (0xff & (value >> 24)));
      write ((byte) (0xff & (value >> 16)));
      write ((byte) (0xff & (value >>  8)));
      write ((byte) (0xff & value));
  }

7. 직렬화 관련된 GOF 패턴 

현상태에 대한 스냅샷적인 저장  (메멘토패턴)

현 상태를 원격지로의 송신         (프록시패턴  // 프록시패턴하고 직접적인 관련은 없음)