boost가 기본 클래스에 대한 포인터를 통해 저장된 객체의 직렬화를 처리하는 방법을 이해하려고합니다. 특히 이렇게 만들어진 아카이브에서 후속 읽기가 어떻게 작동하는지. 여기에 (모든 헤더의 포함을 생략) 몇 가지 예제 코드는 다음과 같습니다기본 클래스에 대한 포인터를 통해 저장된 부스트 아카이브에서 객체를 읽는 작업은 어떻게됩니까?
class A
{
public:
A() {};
~A() {};
virtual void dummy() {};
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {};
};
class B : public A
{
public:
B() : x(0) {};
B(int _x) : x(_x) {};
~B() {};
void dummy() {};
int x;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<A>(*this);
ar & x;
}
};
BOOST_CLASS_EXPORT(B)
BOOST_CLASS_IMPLEMENTATION(B, boost::serialization::object_serializable)
BOOST_CLASS_TRACKING(B, boost::serialization::track_never)
int main(int argc, char *argv[])
{
{ //writing the archive
boost::filesystem::ofstream file("archive.dat", std::ios::trunc);
boost::archive::text_oarchive archive(file);
A* ptr = new B(3);
archive & ptr;
}
{ // reading the archive
boost::filesystem::ifstream file("archive.dat");
boost::archive::text_iarchive archive(file);
/** What is supposed to go here? */
}
return 0;
}
나는
A* ptr;
archive & ptr;
어떻게 든 판독 섹션의 일을 할 것 같은 생각. 그러나 어떻게 작동합니까? 먼저 표준 생성자를 사용하여 힙에 B
유형의 객체를 만들고 (나중에 필요함), 내부 멤버의 값을 설정합니까?
다른 방법이 있습니까? 예를 들어, B
유형의 객체를 보관 파일에 B
(기본 클래스 포인터를 통해 직렬화되었지만) 유형의 객체 만 포함하는 경우 객체를 직접 인스턴스화 할 수 있습니까?
아니요, 표준 생성자 없이는 작동하지 않습니다. 그것은'static void construct (T * t) {:: new (t) T; }'. http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/serialization.html#constructors에 따르면 "내부에서"생성자를 호출합니다. 이것은 무엇을 의미합니까? 기본 생성자없이 얻으려면 분명히 저장 /로드 루틴을 오버로드해야합니다. – janitor048