【发布时间】:2016-05-05 12:01:21
【问题描述】:
以下问题:Boost serialize child class 我正在尝试为使用 boost 序列化生成的存档支持前向兼容性,但我无法使用旧代码读取更新的存档:
class A {
public:
A() {}
virtual ~A() = default;
private:
friend class boost::serialization::access;
template <class Archive> void serialize(Archive &ar, const unsigned int version) {
ar &mAttributeFromA;
}
std::string mAttributeFromA = "mAttributeFromA";
};
BOOST_CLASS_VERSION(A, 0)
class B : public A {
public:
B() {}
private:
friend class boost::serialization::access;
template <class Archive> void serialize(Archive &ar, const unsigned int version)
{
ar &boost::serialization::base_object<A>(*this);
ar &mAttributeFromB;
if (version == 1)
ar &mNewAttribute;
}
std::string mAttributeFromB = "mAttributeFromB";
std::string mNewAttribute = "mNewAttribute";
};
BOOST_CLASS_VERSION(B, 1)
class Manager {
public:
boost::ptr_vector<A> mListOfA; // can store A or B
private:
friend class boost::serialization::access;
template <class Archive> void serialize(Archive &ar, const unsigned int /*version*/) { ar &mListOfA; }
};
BOOST_CLASS_VERSION(Manager, 0)
int main() {
Manager mgr;
mgr.mListOfA.push_back(new B);
mgr.mListOfA.push_back(new B);
std::ofstream ofs("myFile.txt");
{
boost::archive::text_oarchive oa(ofs);
oa << mgr;
}
try {
Manager mgr2;
std::ifstream ifs("myFile.txt");
boost::archive::text_iarchive ia(ifs);
ia >> mgr2;
mgr2.mListOfA.at(0);
} catch(boost::archive::archive_exception e)
{
e.what();
}
}
BOOST_CLASS_EXPORT(A)
BOOST_CLASS_EXPORT(B)
这将生成以下存档:
22 serialization::archive 13 0 0 0 0 2 3 1 B 1 1
0 1 0
1 15 mAttributeFromA 15 mAttributeFromB 13 mNewAttribute 3
2
3 15 mAttributeFromA 15 mAttributeFromB 13 mNewAttribute
如果我尝试使用相同的代码重新加载存档,一切正常。
但是,如果我尝试使用旧版本的代码加载存档:(类版本为 0 并且 mNewAttribute 已消失)
class B : public A {
public:
B() {}
private:
friend class boost::serialization::access;
template <class Archive> void serialize(Archive &ar, const unsigned int version)
{
ar &boost::serialization::base_object<A>(*this);
ar &mAttributeFromB;
}
std::string mAttributeFromB = "mAttributeFromB";
};
BOOST_CLASS_VERSION(B, 0)
反序列化给我一个“输入流错误”
如何使用旧代码反序列化新存档?
-- 编辑-- 奇怪的是,如果我在管理器中添加 A and B 对象,它正在工作。但是只有 A 或只有 B 失败...
【问题讨论】:
-
刚刚检查了链接的答案,它确实正确地描述了通过指向基址的指针序列化派生类型的要求。
-
是的,您在另一个问题中的回答为我提供了能够序列化层次结构并支持向后兼容性的解决方案。我现在的问题是关于前向兼容性(旧代码的新存档)
标签: c++ serialization boost boost-serialization