2009-07-21 27 views
0

XML序列化是否可以使用更加人性化的class_id作爲GUID,使用BOOST_CLASS_EXPORT_GUID描述?class_id in boost :: archive :: xml_oarchive

考慮序列化類:

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> 

當您刪除類標識碼= 「0」,這不會反序列化。我更喜歡class_id =「SomeClass」或類似的東西。

回答

4

是的,解決方案是在名稱 - 值對中序列化您的類。在boost文檔中參見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是unsigned int(basic_archive.hpp)。如果你想要不同的東西,你需要實現你自己的歸檔類。

+0

在指針上寫warper,保存類名和解除引用的指針(2個附加的nvp),並使用提示boost :: serialization :: object_serializable(remove class_id)進行序列化是個好主意。但是當你改變爲binnary_oarchive時,你需要序列化類名,而不僅僅是整數。 – Arpegius 2009-07-29 23:54:21

相關問題