C ++中的boost :: serialization,Python中的反序列化

fro*_*nts 5 c++ python boost

我用C ++生成了一些要在Python程序中访问的数据。我已经弄清楚了如何在C ++中使用boost将序列化到二进制文件或从二进制文件反序列化,但是没有找到如何在Python中访问数据的方法(无需手动解析二进制文件)。

这是我的C ++代码进行序列化:

/* Save some data to binary file */
template <typename T>
int serializeToBinaryFile( const char* filename, const T& someValue,
                           const vector<T>& someVector )
{
    ofstream file( filename, ios::out | ios::binary | ios::trunc );

    if ( file.is_open() )
    {
        boost::archive::text_oarchive oa(file);

        int sizeOfDataType = sizeof(T);

        oa & sizeOfDataType;
        oa & someValue;
        oa & someVector;

        file.close();

        return 0;
    } else {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的反序列化的C ++代码:

/* Load some data from binary file */
template <typename T>
int deSerializeFromBinaryFile( const char* filename, int& sizeOfDataType,
                               T& someValue, vector<T>& someVector )
{
    ifstream file( filename, ios::in | ios::binary );

    if ( file.is_open() )
    {
        boost::archive::text_iarchive ia(file);

        ia & sizeOfDataType;
        ia & someValue;
        ia & someVector;

        file.close();

        return 0;
    } else {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在Python程序中将值和向量加载到对象?

Ric*_*ges 5

boost 文档提到了这样一个事实:二进制表示形式不可移植,甚至不能保证在程序的不同版本之间保持一致。

您可能想要使用 boost::serialization 中提供的 xml 序列化器,然后使用 python 中的 xml 解析器进行读取。

有关如何执行此操作的说明(和示例)如下: http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/tutorial.html#archives

请注意使用 NVP 宏来命名存档中的项目。


ste*_*fan 1

这不是它的工作方式。原则上,序列化/反序列化有两个原因:

  1. 在同一个软件包中存储和检索。这就是 boost archive 的用途。类型和存档格式没有问题。

  2. 序列化以与其他实体进行通信。这是一个完全不同的故事,因为您必须处理机器字大小、操作系统、编程语言、本地化等等。在这里,您通常首先描述序列化格式,从基本类型(如Int32StringFloat以及复合类型(如 、SequenceList)开始。然后您考虑如何用不同的编程语言表示这些类型以及如何序列化/反序列化。您决定使用例如struct/ namedtupleforSequencevector<>/ listfor List。虽然 boost 不是专门为此设计的,但如果您在描述序列化格式时考虑到这一点,则有机会使用 xml 存档。

如果您想在同一台机器上进行通信,则有一种特殊情况。在这里您可以包装序列化(我强烈建议在 C++ 和 python 端使用相同的 dll)。无论如何,你必须坚持使用 python ctypes。