【发布时间】:2015-09-06 06:27:07
【问题描述】:
我有一些大致是这样的类:
class Base {
public:
virtual ~Base() {}
...
};
class Derived1 {
OuterState1& outerState;
InnerState1 innerState;
...
template <typename Ar>
void serialize(Ar& ar, const unsigned int /*version*/) {
ar & innerState;
}
public:
Derived1(OuterState1& outerState) : outerState(outerState) {}
...
};
class Derived2 {
OuterState2& outerState;
InnerState2 innerState;
...
template <typename Ar>
void serialize(Ar& ar, const unsigned int /*version*/) {
ar & innerState;
}
public:
Derived1(OuterState2& outerState) : outerState(outerState) {}
...
};
基本上,类的状态取决于外部环境,我不想序列化它。对于不同的子类,这种状态可能不同。我想序列化这个类。一件好事是 boost::serialization 可以很好地处理多态类,但在我看来这对我来说还不够好。我可以找到以下方法来序列化这些对象,我都不喜欢:
对外部状态使用全局变量。现在我们要么在类中使用这些全局变量,要么重载
load_construct_data()并从这个全局变量创建对象。这个解决方案的问题是它需要全局变量,这通常是一个糟糕的设计,如果程序需要处理多个这样的状态就会中断。不要使用 Boost 的多态序列化特性。相反,将实际类型保存在枚举中,然后以非多态方式保存对象。加载时,加载类型枚举,然后在开关中创建具有适当外部状态的适当类型的对象,然后以非多态方式加载对象。这样做的问题是,我必须进行大量的手动编码,而这将由 Boost 自动完成,而且如果我想序列化此类对象的集合,它就行不通了。
对于这个问题有没有更好、更优雅的解决方案?
【问题讨论】:
-
“基本上,类有一个依赖于外部环境的状态,我不想序列化它。” - 只是不要序列化这些位吗?哦。我想我现在看到了。
(load all data); (post process - setting the state from environment)怎么样? -
@sehe 这不可行,因为一旦我将数据加载到多态对象中,我不知道该对象的确切身份。此外,通过这种方式遍历更复杂的数据结构也很复杂。
-
这是您的要求。内在复杂性就是这样。你将不得不处理它。没有 SSCCE,我将无法提出具体建议
标签: c++ serialization boost boost-serialization