2009-07-21 9 views
0

XMLシリアル化でGUIDとしてより人間らしいclass_idを使用できますか?BOOST_CLASS_EXPORT_GUID ???あなたは、これが逆シリアル化しませんCLASS_ID = "0" を削除するとboost :: archive :: xml_oarchiveのclass_id

<?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> 

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

出力は次のようになります:

は、クラスをシリアル化することを検討してください。私はclass_id = "SomeClass"または類似のものを好むでしょう。

答えて

4

はい、解決策は、クラスを名前と値のペアでシリアル化することです。ブーストのドキュメントでthis itemを参照してください。

2つの異なる動作が必要な場合は、それらを実装する必要があります。テンプレートの特殊化を試してみてください:

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

+0

"あなた自身のアーカイブクラスを実装する必要があります。"ありがとう、それは私が知りたいことです。私は現在、YAML ++を選択しています。 – Arpegius

関連する問題