我们有很多使用 boost :: serialization 完美序列化的本机c ++类。
现在我们要将其部分成员字段更改为属性,以便我们可以在 PropertyGrids 中使用它们。当我们将类定义更改为 ref class X 时,我们收到了大量的编译错误:
#1:
error C2893: Failed to specialize function template 'boost::archive::text_oarchive &boost::archive::detail::interface_oarchive<Archive>::operator <<(T &)' d:\someAddress\someFile.cpp 58
#2:
error C2784: 'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::_Smanip<_Arg> &)' : could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &' from 'boost::archive::text_oarchive' d:\someAddress\someFile.cpp 58
我们这里有很多小类,所以为每个类编写一个包装器会很痛苦!
以下是我们使用的示例类:
ref class gps_position2
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & seconds;
}
public:
gps_position(){};
gps_position(float s)
{
this->seconds = s;
}
property float seconds;
};
这是主要的测试代码:
int main()
{
std::ofstream ofs("out.txt");
gps_position2 g(24.567f);
// save data to archive
{
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << g;
}
// ................
return 0;
}
是否可以将 boost :: serialization 与托管类一起使用?
修改
如果我们将类使用代码更改为:
...
gps_position2^ g = gcnew gps_position2(24.567f);
...
然后我们只得到1个错误:
error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>' D:\path\to\Boost\boostw\boost\archive\detail\check.hpp 60
答案 0 :(得分:0)
我知道你说你不想把你所有的课程都包好。但是,不是将所有类包装在C ++ / CLI中,而是开发非托管C ++ dll并公开所有相关函数可能是值得的。然后,您可以使用P/Invoke从托管代码(例如C ++ / CLI)调用非托管dll。不确定这是否可行。