我试图将数据从C进程交换到Python进程,为此我使用了boost.serialization库,它可以在两个C进程之间以简单的文本格式进行序列化和反序列化。
现在,为了从Python端访问序列化数据,我使用boost.python库。我将序列化代码 Package 到Python模块中,从Python环境内部序列化文本存档中的数据并从那里再次加载它是有效的,但是从Python端加载由C++进程创建的文本存档中的数据给我带来了RuntimeError: input stream error
。这是因为它需要不同的格式(见下文)。
我正在使用boost.serialization教程“一个非常简单的案例”中的gps_position
类:
class gps_position {
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public:
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
我使用以下save
和load
函数:
void save(){
std::cout << "save()" << std::endl;
std::ofstream ofs("archive");
gps_position g(35, 59, 24.567f);
{
boost::archive::text_oarchive oa(ofs);
oa << g;
}
}
void load(){
std::cout << "load()" << std::endl;
gps_position newg;
{
std::ifstream ifs("archive");
boost::archive::text_iarchive ia(ifs);
ia >> newg;
}
}
这是boost.python的 Package 代码:
BOOST_PYTHON_MODULE(example) {
boost::python::def("save", &save);
boost::python::def("load", &load);
}
[1]以下是C++端的文本存档文件的内容:
22 serialization::archive 17 22 serialization::archive 17 0 0 35 59 2.456699944e+01
[2]文本归档文件来自相同的序列化方法,但如前所述,它被 Package 为Python模块,并从交互式Python环境中调用:
0 0 35 59 2.456699944e+01
我了解到22 serialization::archive 17
描述了归档文件的签名。但是为什么我在[1]中出现了两次?为什么在[2]中一次也没有出现?我可以忽略签名(它当时有效),但是我想理解为什么 Package 代码会改变功能。
1条答案
按热度按时间qpgpyjmq1#
1.为什么两次?
“text_oarchive”在构造时将签名写入输出流,但在归档完成时也会再次写入签名。实际上,签名用于指示归档的开始和结束。
1.为什么是零次?
当序列化代码被 Package 为Python模块时,实际上是 boost.python 库执行序列化(反序列化),而不是 boost.serialization。
此外,当您创建归档文件时,它不包括签名元数据,这仅仅是因为Python的反序列化过程不需要它。
通常,为了确保使用相同的序列化方法保存和加载归档文件,可以选择JSON,它与C++和Python环境都兼容。