0

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" 或类似的东西。

4

1 回答 1

4

是的,解决方案是在名称-值对中序列化您的类。请参阅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)。如果你想要不同的东西,你需要实现你自己的归档类。

于 2009-07-29T19:34:54.233 回答