【发布时间】:2010-05-24 22:21:07
【问题描述】:
我在看boost序列化库,提供序列化支持的侵入式方法是定义一个带有签名的成员函数(简化):
class ToBeSerialized {
public:
//Define this to support serialization
//Notice not virtual function!
template<class Archive>
void serialize(Archive & ar)
{.....}
};
此外,通过基指针支持派生类序列化的一种方法是使用以下类型的宏:
//No mention to the base class(es) from which Derived_class inherits
BOOST_CLASS_EXPORT_GUID(Derived_class, "derived_class")
其中 Derived_class 是从基类继承的某个类,例如 Base_class。多亏了这个宏,才能通过指向 Base_class 的指针正确地序列化 Derived_class 类型的类。
问题是: 我在 C++ 中用于编写通过从 std::string 到(指向)函数的映射实现的抽象工厂,该函数返回所需类型的对象(由于协变类型,一切都很好)。
悬停我看不到如何使用上述非虚拟序列化模板成员函数在不知道其类型的情况下正确反序列化(即构造)对象(但假设类型信息已由序列化程序存储,在字符串中说)。
我想做的(保持与上面相同的命名法)类似于以下内容:
XmlArchive xmlArchive; //A type or archive
xmlArchive.open("C:/ser.txt"); //Contains type information for the serialized class
Base_class* basePtr = Factory<Base_class>::create("derived_class",xmlArchive);
使用右侧的函数在 Derived_class 类型的堆上创建一个对象(通过默认构造函数,这是我知道如何解决的部分)并调用 xmlArchive 的序列化函数(我在这里卡住了!) ,即执行以下操作:
Base_class* Factory<Base_class>::create("derived_class",xmlArchive)
{
Base_class* basePtr = new Base_class; //OK, doable, usual map string to pointer to function
static_cast<Derived_class*>( basePtr )->serialize( xmlArchive ); //De-serialization, how?????
return basePtr;
}
我确信这是可以做到的(boost serialize 可以做到,但它的代码是不可理解的!:P),但我不知道怎么做。 关键问题是序列化函数是一个模板函数。所以我不能有一个指向通用模板函数的指针。 由于编写模板化序列化函数的目的是使代码通用(即不必为不同的归档器重新编写序列化函数),因此必须为所有可能的归档类型注册所有派生类是没有意义的,比如:
MY_CLASS_REGISTER(Derived_class, XmlArchive);
MY_CLASS_REGISTER(Derived_class, TxtArchive);
...
事实上,在我的代码中,我依靠重载来获得正确的行为:
void serialize( XmlArchive& archive, Derived_class& derived );
void serialize( TxtArchive& archive, Derived_class& derived );
...
要记住的关键点是存档类型始终是已知的,即我从不对存档类使用运行时多态性...(我再次在存档类型上使用重载)。
有什么建议可以帮助我吗?
非常感谢您!
干杯
【问题讨论】: