2009-07-21 5 views
0

Возможно ли, чтобы сериализация XML использовала более человечный класс class_id как GUID, описанный с использованием BOOST_CLASS_EXPORT_GUID ???class_id в 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> 

При удалении 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

Это отличная идея написать warper over pointer, сохранить имя класса и разыменованный указатель (2 дополнительных nvp) и сериализовать с помощью подсказки boost :: serialization :: object_serializable (удалить class_id). Но когда вы переходите на binnary_oarchive, вам нужно сериализовать имя класса, а не целое. – Arpegius

+0

«нужно реализовать свой собственный класс архива», спасибо, вот что я хочу знать. В настоящее время я выбираю YAML ++, это хорошо подходит для этой задачи. – Arpegius