2014-01-10 2 views
1

나는 아주 간단한 클래스를 가지고 있는데, 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

를 사용하고 어떤 도움을 환영합니다.

답변

1

여기서 실수를 범했습니다. 즉, 엔터티 유형 인 OBJECT를 직렬화하지만 POINTER를 deserialize하려고합니다. 일관성있게 만들어야합니다 (OBJECT-OBJECT 또는 POINTER-POINTER).

전체 스토리와 클래스 엔터티를 말하지 않은 것 같습니다. 엔터티는 일부 클래스 계층 구조의 기본입니다. 이 경우에는 POINTER의 직렬화를 사용해야합니다. 게다가 여기에 설명 된 메소드가 필요할 것입니다 : Boost Serialization: pointer conainer to <BASE> contains various of DERIVED objects

+0

텍스트가 포인터가 아닌 객체를 직렬화 할 때 class_id가 생략됩니다. 이는 코드에서 변경되어 이전 버전과의 호환성 문제가 발생했습니다. – sage