我正在使用boost序列化\反序列化几个类到磁盘。我正在重构许多需要更改类层次结构的类。我希望以下伪代码在传达我的情况时足够清楚:
原始设计类似于以下内容:
class Alpha : public BaseOne, public BaseTwo
{
//member data omitted
void serialize(Archive & ar, const unsigned int version);
}
inline void Alpha::serialize(Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseOne);
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseTwo);
// also serialize member data
}
class Beta: public Alpha
{
//member data omitted
void serialize(Archive & ar, const unsigned int version);
}
inline void Beta:::serialize(Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Alpha);
// also serialize member data
}
类层次结构已更改为以下内容:
class Alpha : public BaseOne
{
void serialize(Archive & ar, const unsigned int version);
}
class Beta: public Alpha, public BaseTwo
{
void serialize(Archive & ar, const unsigned int version);
}
是否可以将使用以前类层次结构保存的数据反序列化到新设计中?
此致 约翰
答案 0 :(得分:1)
我假设您已熟悉Boost序列化(Boost class serialization, change in member types)中的常规版本控制支持。
在这种情况下,我说你无法预料到这一点,因为类型信息是"顺便说一下"在数据流中(并且可能不再映射)。我建议让旧的层次结构仍然可用,例如使用内联命名空间:
namespace MyNS
{
namespace V1 {
struct Alpha;
struct Beta;
}
inline namespace V2 {
struct Alpha;
struct Beta;
struct Document { /* */ }
Document upgrade(V1::Document&&);
}
}