序列化定义为C结构的Python扩展类型,包含PyObject*成员

6 投票
1 回答
1251 浏览
提问于 2025-04-16 17:35

我正在通过Python运行C++代码,并想要对一个扩展类型进行序列化。

我有一个C++结构体(py_db_manager),里面包含指向数据库对象和对象管理器对象的指针(这两个对象都是用C++写的)。我用一个Python类型对象(t_db_manager)将它们包装起来。我的问题是,这个Python类型需要知道如何序列化这两个指针,以便将它们发送到一些子进程中。因此,我使用copy_reg模块注册了这个类型(这相当于在这个类型上写一个reduce()方法)。不过,我不太确定该在里面放什么。是应该用PyObject*构建一个元组,还是只用整数指针呢?谁能帮帮我?

typedef struct
{
  PyObject_HEAD
  PyObject* man_inst_ ;
  PyObject* db_inst_ ;

}py_db_manager;`

这是Py_TypeObject

PyTypeObject t_db_manager = {
    PyObject_HEAD_INIT(0)               /* tp_head */
    0,                                  /* tp_internal */
    ".py_db_manager",                  /* tp_name */
    sizeof(py_db_manager)};

这是reduce方法中的代码:

PyObject *pickle_manager(PyObject *module, PyObject *args)
{
    py_db_manager *cpp_manager =0;
    PyObject *values = NULL,
        *tuple = NULL;
    char text[512];

    if (!PyArg_ParseTuple(args, "O!", &t_db_manager, &cpp_manager))
        goto error;
    sprintf(text,"man_inst_, db_inst_");
    if ((values = Py_BuildValue("(sii)", text,
                                cpp_manager->man_inst_, cpp_manager->db_inst_)) == NULL)
        goto error;
    tuple = Py_BuildValue("(OO)", manager_constructor, values);

error:
    Py_XDECREF(values);
    return tuple;
}

1 个回答

2

因为这个数据会被传递给另一个进程,所以仅仅把整数指针进行“序列化”是行不通的。不同的进程使用不同的内存空间,因此它们看不到相同的东西。

所以,针对你的问题,你应该把完整的对象进行“序列化”,然后在接收端重新构建它们。

撰写回答