我用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程序中将值和向量加载到对象?
boost 文档提到了这样一个事实:二进制表示形式不可移植,甚至不能保证在程序的不同版本之间保持一致。
您可能想要使用 boost::serialization 中提供的 xml 序列化器,然后使用 python 中的 xml 解析器进行读取。
有关如何执行此操作的说明(和示例)如下: http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/tutorial.html#archives
请注意使用 NVP 宏来命名存档中的项目。
这不是它的工作方式。原则上,序列化/反序列化有两个原因:
在同一个软件包中存储和检索。这就是 boost archive 的用途。类型和存档格式没有问题。
序列化以与其他实体进行通信。这是一个完全不同的故事,因为您必须处理机器字大小、操作系统、编程语言、本地化等等。在这里,您通常首先描述序列化格式,从基本类型(如Int32、String)Float以及复合类型(如 、Sequence等List)开始。然后您考虑如何用不同的编程语言表示这些类型以及如何序列化/反序列化。您决定使用例如struct/ namedtupleforSequence和vector<>/ listfor List。虽然 boost 不是专门为此设计的,但如果您在描述序列化格式时考虑到这一点,则有机会使用 xml 存档。
如果您想在同一台机器上进行通信,则有一种特殊情况。在这里您可以包装序列化(我强烈建议在 C++ 和 python 端使用相同的 dll)。无论如何,你必须坚持使用 python ctypes。
| 归档时间: |
|
| 查看次数: |
2684 次 |
| 最近记录: |