2009-07-21 3 views
0

BOOST_CLASS_EXPORT_GUID을 사용하여 설명 된 GUID로보다 인간 친화적 인 class_id를 XML 직렬화에서 사용할 수 있습니까 ???boost :: archive :: xml_oarchive의 class_id

는 직렬화 클래스를 고려

SomeClass* b=new SomeClass("c"); 
{ 
    boost::archive::xml_oarchive oa(cout); 
    oa.register_type<SomeClass>(); 
    oa << boost::serialization::make_nvp("b",b); 
} 

출력과 같은 것입니다 :

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="5"> 
<b class_id="0" tracking_level="1" version="0" object_id="_0"> 
<name>c</name> 
</b> 
</boost_serialization> 

당신이 CLASS_ID을 제거

이 = "0"이 직렬화되지 않습니다. class_id = "SomeClass"또는 비슷한 것을 선호합니다.

답변

4

예, 해결책은 이름 - 값 쌍으로 클래스를 직렬화하는 것입니다. 부스트 문서에서 this item을 참조하십시오.

두 가지 동작을 원할 경우이를 구현해야합니다. 템플릿 전문화를 시도해보십시오.

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & degrees; 
    ar & minutes; 
    ar & seconds; 
} 

template<class Archive> 
void serialize_with_name(Archive & ar, const unsigned int version) 
{ 
    ar & make_nvp("degrees", degrees); 
    ar & make_nvp("minutes", minutes); 
    ar & make_nvp("seconds", seconds); 
} 

template<> 
void serialize<>(xml_iarchive & ar, const unsigned int version) 
{ 
    serialize_with_name(ar, version); 
} 

template<> 
void serialize<>(xml_oarchive & ar, const unsigned int version) 
{ 
    serialize_with_name(ar, version); 
} 

기본적으로 object_id_type은 부호없는 int (basic_archive.hpp)입니다. 다른 무언가를 원하면 자체 아카이브 클래스를 구현해야합니다.

+0

포인터 위에 워퍼를 작성하고 클래스 이름과 참조 해제 포인터 (2 개의 추가 nvp)를 저장하고 힌트 boost :: serialization :: object_serializable (class_id 제거)을 사용하여 직렬화하는 것이 좋습니다. 그러나 binnary_oarchive로 변경할 때 정수가 아닌 클래스 이름을 직렬화해야합니다. – Arpegius

+0

"감사 보관 파일을 직접 구현해야합니다. 알고 싶습니다. 저는 현재 YAML ++을 선택했습니다. – Arpegius

관련 문제