Serialization

직렬화는 객체 데이터를 비트의 나열로 만들어 파일에 저장하거나 네트워크 전송할 수 있게 만드는 것을 말한다.
(직렬화 되어 있으면, 별도의 작업 없이 쉽게 복제 가능)

다른 언어와 달리 C++은 직렬화를 언어차원에서 지원하지 않는다.
( 직렬화를 지원하는 언어는 메타 데이터를 정의하여 컴파일된 바이너리 안에 포함시킨다-리플렉션(reflection) )
C++은 컴파일된 바이너리에 메타 데이터가 없고, 리플렉션 기능을 제공하지 않음

Boost 라이브러리의 Boost.Serialization을 이용해서 직렬화를 수행한다.
struct Address{
string street;
string city;
int suite;
private:
friend class boost::serialization::access;
template <class Ar> void serializae(Ar& ar, const unsigned int version){
ar & street;
ar & city;
ar & suite;
}
};
struct Contact{
string name;
Address* address=nullptr;
private:
friend class boost::serialization::access;
template <class Ar> void serialize(Ar& ar, const unsigned int version){
ar & name;
ar & address; // *address
}
};
위처럼 직렬화를 수행하면, 각 클래스를 구성하는 모든 항목이 객체를 저장하는 위치에 비트열로 나열된다.

포인터 역참조 없이 Boost는 내부적으로 스스로 대응한다.
auto clone=[](const Contact& c){
// 1. Contact
ostringstream oss;
boost::archive::text_oarchive oa(oss);
oa<<c;
strint s=oss.str()
// 2. Contact
istringstream iss(oss.str());
boost::archive::text_iarchive ia(iss);
Contact result;
ia>>result;
return result;
};
//
Contact jane=clone(john);
jane.name="Jane";
// ...