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

2024-10-01 15:38:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在C++中生成了一些我想在Python程序中访问的数据。我已经知道如何用Boost C++来对/从二进制文件进行序列化/反序列化,而不是如何在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;
    }
}

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

^{pr2}$

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


Tags: 文件数据代码程序序列化二进制filenamefile
3条回答

不是这样的。原则上,序列化/反序列化有两个原因:

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

  2. 序列化以与其他实体通信。这是一个完全不同的故事,因为你必须处理机器字大小,操作系统,编程语言,本地化等等。在这里,您通常从描述序列化格式开始,首先是基本类型,如Int32StringFloat,以及复合类型,如{},List等等。然后考虑如何用不同的编程语言表示这些类型,以及如何序列化/反序列化。您决定将struct/namedtuple用于Sequence,而{}/list用于List。虽然boost并不是专门为此而设计的,但是如果您在描述序列化格式时考虑到这一点,就有机会使用xml归档文件。

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

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

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

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

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

使用boostpython向python公开反序列化函数。 您需要分别为所需的每种类型公开函数(不能向python公开模板)。在

相关问题 更多 >

    热门问题