직렬화(serialization) 에 대한 짧은 이야기 (Q/A)
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 패턴
현상태에 대한 스냅샷적인 저장 (메멘토패턴)
현 상태를 원격지로의 송신 (프록시패턴 // 프록시패턴하고 직접적인 관련은 없음)