class_id в boost::archive::xml_oarchive

Возможно ли для сериализации XML использовать более удобный для человека class_id в качестве GUID, описанного с помощью BOOST_CLASS_EXPORT_GUID ???

Рассмотрим сериализацию класса:

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" или что-то подобное.


person Arpegius    schedule 21.07.2009    source источник


Ответы (1)


Да, решение состоит в том, чтобы сериализовать ваш класс в паре имя-значение. См. этот пункт в документации по Boost. .

Если вам нужны два разных поведения, вам придется их реализовать. Попробуйте со специализацией шаблона:

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). Если вы хотите что-то другое, вам нужно реализовать свой собственный класс архива.

person fnieto - Fernando Nieto    schedule 29.07.2009
comment
Это отличная идея написать warper над указателем, сохранить имя класса и разыменованный указатель (2 дополнительных nvp) и сериализовать, используя подсказку boost::serialization::object_serializable (удалить class_id). Но когда вы переходите на binnary_oarchive, вам нужно сериализовать имя класса, а не просто целое число. - person Arpegius; 30.07.2009
comment
«нужно реализовать свой собственный класс архива», спасибо, это то, что я хочу знать. В настоящее время я выбираю YAML++, он хорошо подходит для этой задачи. - person Arpegius; 03.08.2009