将C++ boost序列化器 Package 为boost python模块会如何改变序列化的方式?

7vux5j2d  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(152)

我试图将数据从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)
    {}
};

我使用以下saveload函数:

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 代码会改变功能。

qpgpyjmq

qpgpyjmq1#

1.为什么两次?
“text_oarchive”在构造时将签名写入输出流,但在归档完成时也会再次写入签名。实际上,签名用于指示归档的开始和结束。
1.为什么是零次?
当序列化代码被 Package 为Python模块时,实际上是 boost.python 库执行序列化(反序列化),而不是 boost.serialization

  • boost.python* 使用Python内置的***pickle***模块对对象进行序列化(反序列化),这是一种完全不同的序列化格式,与 boost.serialization 的文本存档格式不兼容。

此外,当您创建归档文件时,它不包括签名元数据,这仅仅是因为Python的反序列化过程不需要它。
通常,为了确保使用相同的序列化方法保存和加载归档文件,可以选择JSON,它与C++和Python环境都兼容。

相关问题