pickleing/unpickling替换(与API兼容)类实现

Pickling/unpickling alternative (API-compatible) class implementations

本文关键字:兼容 实现 API unpickling 替换 pickleing      更新时间:2023-10-16

在分布式计算项目中,我们使用Pyro通过节点之间的连线传递对象;Pyro使用pickle在内部序列化和反序列化对象。

项目中的一些类有两种实现:一种是纯Python(为了便于安装,尤其是对于Windows用户),另一种是c++/boost::Python(速度更快,但需要boost+了解如何编译扩展模块)。python和c++类都支持pickle(在c++中,这是通过boost::python完成的)。

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

然而,pickle使用__module____class__来标识实例,因此,当基于c++的对象通过连线传递给另一个不支持它的节点时,取消pickle将失败。

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

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