나는 아주 간단한 클래스를 가지고 있는데, boost :: serialize로 직렬화하려고합니다.텍스트 보관함의 직렬화 문제 부스트
class Entity {
private:
ObjectType objectType;
public:
Entity(ObjectType t = tA) { objectType = t; }
public:
~Entity() {}
private:
friend class boost::serialization::access;
template <typename Archive>
friend void boost::serialization::serialize(Archive& ar, Entity& o, const unsigned int version);
};
}
개체 유형을 열거이다
typedef enum ObjectType {
tA,
tB,
...
tZ
}
직렬화 함수는 다음과 같다 :
template<class Archive>
void serialize(Archive & ar, Entity & o, const unsigned int version)
{
ar & o.objectType;
}
저장 및 로딩은 다음과 같은 기능이 수행된다
void saveObject2File(const Entity &o, const char * filename) {
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa & o;
}
Entity * loadObjectFromFile(const char * filename) {
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
Object * o;
ia & o;
return o;
}
파일에 직렬화하면 다음 텍스트가 기록됩니다. 여기서 17은 objectType 변수에 저장된 정수 값입니다. I이 파일을 읽을 때
22 serialization::archive 10 0 0 17
그러나, 값 17은 version
파라미터로서 serialize
법에 의해 수신되고, objectType
는 잘못된 값 (o.objectType = -858993460)
할당된다.
저장 및로드하기 전에 수동으로 클래스 버전 BOOST_CLASS_VERSION(Entity, 111);
을 변경하면 런타임 예외가 발생합니다. 쓰기는 111 버전 번호로 작동하지만 파일을 읽는 것은 실패합니다.
이상하게도 XML 보관함을 사용하면 문제가 발생하지 않습니다. 열거 형 대신 정수를 직렬화하도록 선택하면 문제가 동일합니다. text_iarchive가 text_oarchive에서 제공하지 않는 추가 매개 변수를 찾고있는 것처럼 보이므로 17이 버전 번호로 읽혀집니다.
내가 부스트 1.55 및 Visual Studio 2013
를 사용하고 어떤 도움을 환영합니다.
텍스트가 포인터가 아닌 객체를 직렬화 할 때 class_id가 생략됩니다. 이는 코드에서 변경되어 이전 버전과의 호환성 문제가 발생했습니다. – sage