boost::archive::xml_oarchive 中的 class_id
Posted
技术标签:
【中文标题】boost::archive::xml_oarchive 中的 class_id【英文标题】:class_id in boost::archive::xml_oarchive 【发布时间】:2009-07-21 14:08:02 【问题描述】: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" 或类似的东西。
【问题讨论】:
【参考方案1】:是的,解决方案是在名称-值对中序列化您的类。请参阅 boost 文档中的 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 是 unsigned int (basic_archive.hpp)。如果你想要不同的东西,你需要实现你自己的归档类。
【讨论】:
最好在指针上编写 warper,保存类名和取消引用的指针(2 个额外的 nvp),并使用提示 boost::serialization::object_serializable(删除 class_id)进行序列化。但是当您更改为 binnary_oarchive 时,您需要序列化类名而不仅仅是整数。 “需要实现你自己的归档类”谢谢,这就是我想知道的。我目前选择 YAML++,它看起来很适合这项任务。以上是关于boost::archive::xml_oarchive 中的 class_id的主要内容,如果未能解决你的问题,请参考以下文章