2009. 10. 15. 11:18 연구실/파편화된 기록들
C++ object serialization 란 무엇인가?
국내에 번역된 말로는 "객체 직렬화" 라고 하는데, 우리나라말로 좀 더 풀어 보면, 객체의 메모리를 연속적인 바이트로 만들고, 만들어진 연속적인 바이트를 원래의 객체로 복원하는 작업을 말한다.

그러므로 C++ object serialize 라고 한다면, 위에서 말한 작업을 하라는 것이다.

어디에 쓰이는가?

이러한 객체 직렬화는 메모리에 있는 데이터를 스트림으로 보낼 때 사용 한다. 스트림을 이용하면 객체(객체를 아니여도 ... )를 파일에/로/ 출력/입력 할 수 있으며, 네트워크에서 송수신 할 수 있으므로, 보통, 객체를 파일로 저장해서 읽으려고 할 때, 네트워크로 보내고 받을 때 이다.

개인적 사견으로는 암호화를 할 때, 사용 될 수도 있을것 같다.

여기서 잠깐 스트림에 대해서 정리하면, 스트림이란 입구와 출구가 있는 파이프 라인이다.

C++에서 어떻게 파일 스트림으로 보낼 수 있는가?
C++ 코드로 스트림화 한다면, 다음과 같을 것이다. 해당 소스 코드는

http://functionx.com/cpp/articles/serialization.htm

에서 가져 온 것이다.

츨력 예제.

입력 예제

직렬화가 보다 직관적이다 라고 해야 할까? 그냥 메모리에 있는것을 크기만큼 write 하면 끝나고 read 하면 끝난다. 하지만 이것이 쉬운 이유는, 객체가 POD 데이터이므로 쉬웠던 것이다.

실제로 객체의 안에 컨테이너가 있거나, 동적 메모리가 올라간 형태라면 위의 방식 데로 사용 할 수 없다. 왜냐하면 포인터를 예로 들면, 포인터 4 바이트는 특정 메모리를 가리키고 있는데, 특정 메모리까지 쫒아가 write 작업을 하지 않으면 말짱 꽝이기 때문이다.

즉, 쭉정이가 된다.(껍질만 있는 곡식이나 과일을 뜻한다.)

그래서 C++ 에서 객체를 다루고자 할 때는 손이 많이 간다. 그래서 그런지 이러한 작업을 도와 주는 라이브러리가 있다.

도와주는 라이브러리는 어떤게 있는가?
  1. Google Protocol Buffer
  2. Sweet Persist
  3. s11n
  4. boost::serialize

1. Google Protocol Buffer
독자적인 스크립트 언어가 있으며, 구글에서 만들었다. 객체마다 개별적인 스크립트를 만들어야 하는 불편함과, 한 종의 객체를 여러개 연결하여 하나의 파일로 출력 할 때는, 수동으로 그 객체의 경계를 만들어 주고 읽을 때 역시 그 곙계를 끊어서 읽어줘야 한다.

스크립트로 작성된 파일은 자바, C++, 파이선 등에서 읽고 쓸 수 있도록 개별 언어마다 코드를 만들어 준다. 그러므로, .. 다른 언어간의 이식성이 무척 뛰어나다.

만약 C++ 로 쓰고, 자바로 읽어야 되는 상황이나 그 반대의 상황일 때는 1번이 좋을 것이다.

2. Sweet Persist
라이렌스가 있어, 제약이 있어 알아보지 않았다. (사용해 보지 못했다.)

3. s11n
유니코드 미지원, 바이너리 출력을 할 수 없다. 그리고 정적라이브러리만 사용 할 수 있다. 하지만, 다양한 데이터 포맷(텍스트 기반)과 DB에 쓸 수 있도록 도와 준다. (사용해 보지 못했다)

4. boost::serialize
C++에서 사용하기 쉽다. 상속 객체, 멤버 객체, 배열, 표준 컨테이너, 표준 string 객체 등을 쉽게 읽고 쓸수 있게 해주며, 텍스트, XML, 바이너리, 유니코드 등을 지원한다. : )

테스트로 사용해 보는 중이고, 이번 스터디에서 소개가 될 라이브러리 이다.

현재인 2009-10-13짜의 정보이므로, 시간이 지나면, 변경될 수 있는 점이 있으니, 한번 직접 보길 바란다.

라이브러리를 어떻게 쓰는가?

boost:serialize의 사용법 : 바이너리로 std::vector<std::vector<unsigned char>> 를 밀어 넣고 빼오기만을 만들어 보았다.


... 익히는게 어렵지 않고, 샘플 코드도 많이 제공 하고 있으니, 영어를 못한다고 해도 크게 무리가 되진 않는다.

boost::serialize 에서 어떻게 바이너리인 메모리 데이터가 문자로 바뀔 수 있을까?

<정리중>

boost::serialize 에서 직렬된 바이너리/텍스트 의 크기가 얼마나 되는지 어떻게 알 수 있을까?

<정리중>

boost::serialize 에서 직렬 시킬 대상을 파일/스트링을 제외하고, 메모리에 어떻게 바로 저장 할 수 있을까요?

<정리중>

s11n 사용 방법

<준비중>

실무에 어떻게 쓸까?

정리 중

  1. 네트워크 모듈로는 C++에서 사용 할 수 있을까? - 단순 형변환보다 더 좋을까?
  2. 파일에 대한 입출력시 암호화를 해야 할까?
  3. 텍스트 출력 후 어떻게 그걸 사람 눈으로 읽을 수 있을까?
  4. 얼마나 빠를까?


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of https://www.ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.10.15 17:13 신고  Addr  Edit/Del  Reply

    1. boost::serialize 설명, 일어 번역기 돌리면 그래도 볼만했다.

    http://hw001.gate01.com/eggplant/tcf/cpp/boost_serialization.html

  2. Favicon of https://www.ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.10.15 17:16 신고  Addr  Edit/Del  Reply

    http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/index.html
    어디를 보나 제일 좋다. 그러나 해석이 힘들다.

  3. 2009.10.16 15:07  Addr  Edit/Del  Reply

    비밀댓글입니다

  4. Favicon of https://www.ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.10.22 23:23 신고  Addr  Edit/Del  Reply

    실제로 적용해 보니, 네트워크 패킷 대용으로 쓰기엔 부적절하다. 이유는 다음과 같다.

    1. 정렬화를 하기 위해서 패킷을 받거나 보낼때마다 버퍼에서 다시 풀어야 한다.
    2. 정렬화를 하기 위해 코드르 만지는 것이 기존에 코드생성기에서 하는 것 보다 더 신경 쓰인다.
    3. 2번에 추가 하자면, 패킷을 추가할 때마다 코드를 만드는 비용 역시 똑같다.

    하지만 다음의 경우에는 쓸만한다.
    1. 여러 구조로 메모리에 올라와져 있는 경우, 이것을 파일로 쓸 때 편하다.
    2. 긴급하게 파일로 써야 할 때, 코드의 일정 부분 수정을 통해서, 바로 파일 입출력이 가능해 진다.


    파일 입출력의 대안
    1. 루아나 파이썬 등의 문법 형태로 파일을 만들면, C에서 해당 스크립트의 가상머신을 생성 하고, 로드만 하면 되므로 이게 더 편하다.


    요 근래의 생각으로는
    C/C++ 하나로 국한되기 보다, 각 언어의 장점을 살려 좋은것만 빼오는게 제일 좋다고 생각 한다.

  5. 초보자 2012.03.17 10:19  Addr  Edit/Del  Reply

    좋은 글 감사합니다 ㅎㅎ