Pickling/unpickling可选(APIcompatible)类实现

2024-09-28 17:00:41 发布

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

在分布式计算项目中,我们使用Pyro在节点之间传递对象;Pyro使用pickle在内部序列化和反序列化对象。你知道吗

项目中的一些类有两种实现:一种是纯Python(为了便于安装,特别是Windows用户),另一种是c++/boost::Python(速度要快得多,但需要boost+关于如何编译扩展模块的知识)。python和c++类都支持pickling(在c++中,通过boost::python完成)。你知道吗

这些类有不同的完全限定名(mupif.Octree.Octantmupif.fastOctant.Octant),但后者是前者的别名,并覆盖纯Python定义(mupif.Octree.Octant=mupif.fastOctant.Octant),因此它对用户是透明的,如果节点上可用,则始终使用fast变体。你知道吗

但是,pickle使用__module____class__来标识实例,因此当基于c++的对象通过连接传递到另一个不支持它的节点时,取消pickle将失败。你知道吗

解决这个问题的办法是什么?更改类的__module__,即foo.fastOctant.Octant.__class__.__module__='mupif.Octree'是否可以接受?会不会有副作用我还没看到?你知道吗


Tags: 项目对象用户节点序列化pickleclassmodule
1条回答
网友
1楼 · 发布于 2024-09-28 17:00:41

如果没有可用的fast实现,那么用另一种方式(fast=normal)别名是否有帮助?也许这只能在取消勾选然后反转时进行,以避免在其他代码中混淆检查?你知道吗

相关问题 更多 >