我们的项目使用boost :: serialization来序列化很多东西。 但是某些类型没有正确注册,并且在序列化它们时会出现“未注册的类”错误 我已将问题缩小到BOOST_CLASS_EXPORT_KEY,对于某些类型,它不会生成代码。 BOOST_CLASS_EXPORT_KEY的作用是:
namespace boost {
namespace serialization {
template<>
struct guid_defined< T > : boost::mpl::true_ {};
template<>
inline const char * guid< T >(){
return K;
}
} /* serialization */
} /* boost */
序列化的所有对象都从名为Serializable的基类继承。 序列化总是通过指向基类的指针完成。
除了一个案例外,这个工作正常: 有一个类模板SerializableList,它是一个Serializable,它包含一个T
列表template< typename T>
class SerializableList
{
...
std::vector<T> m_list;
template<class Archive>
void serialize( Archive & ar, const unsigned int /*version*/ )
{
ar & boost::serialization::base_object<businessObjects::Serializable>(*this);
ar & mList;
}
};
在专用的cpp和hpp文件中,我们然后声明此模板的每个实例化以提升序列化,如下所示:
HPP:
BOOST_CLASS_EXPORT_KEY( SerializableList<SomeT*> );
BOOST_CLASS_EXPORT_KEY( SerializableList<SomeOtherT*> );
BOOST_CLASS_EXPORT_KEY( SerializableList<AThirdT*> );
CPP:
BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<SomeT*> );
BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<SomeOtherT*> );
BOOST_CLASS_EXPORT_IMPLEMENT( SerializableList<AThirdT*> );
但这些行中有一半不会在最终的可执行文件中生成可执行代码!如果我们在每条线上放置一个断点并运行,那么一半的断点就会消失,那些留下来的是工作类型(我们可以序列化的那些)。
例如,断点将保持在SerializableList<SomeT*>
和SerializableList<AThirdT*>
但不会SerializableList<SomeOtherT*>
。
顺便说一句,我们也尝试直接调用boost::serialization::guid<T>()
,虽然它可以正常说:
boost::serialization::guid<SerializableList<SomeT*> >()
返回密钥,
它不适合
boost::serialization::guid<SerializableList<SomeOtherT*> >()
调用默认实现...
那么是否存在编译器错误(我们使用Visual C ++ 2010 SP1),或编译器忽略其中一些特殊化的一些好理由?
我忘了提及,所有这些代码都在一个库中,它与exe项目相关联。我尝试过不同的exe项目,有时它的工作有时它没有...编译选项是相同的...我真的有没有线索发生了什么:'(
答案 0 :(得分:0)
我们找到了解决方案,
一个(可序列化的)类有几个SerializableList成员,并且没有包含所有“BOOST_CLASS_EXPORT_KEY
”行的文件。
其他正在运作的项目没有使用那个特定的班级......