0

BOOST_CLASS_EXPORT_GUIDXMLシリアル化で、 ???を使用して記述された、より人間に優しいclass_idを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"またはそれに類似したものが好きです。

4

1 に答える 1

4

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

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)です。別のものが必要な場合は、独自のアーカイブクラスを実装する必要があります。

于 2009-07-29T19:34:54.233 に答える