Pickling / unpickling替代(API兼容)类实现

时间:2015-11-17 09:24:30

标签: python c++ alias pickle

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

项目中的一些类有两个实现:一个是纯Python(为了便于安装,特别是对于Windows用户),一个在c ++ / boost :: python中(更快,但需要提升+知道如何编译扩展模块)。 python和c ++类都支持pickling(在c ++中,通过boost :: python完成)。

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

但是,pickle使用__module____class__来标识实例,因此当基于c ++的对象通过网络传递给另一个不支持它的节点时,unpickling将失败。

这是什么解决方案?是否可以更改classe的__module__,即foo.fastOctant.Octant.__class__.__module__='mupif.Octree'?可以有一些我还没看到的副作用吗?

1 个答案:

答案 0 :(得分:1)

如果没有快速实现可用,以另一种方式(快速=正常)对别名有帮助吗?也许这只能在解开时间然后反转,以避免混淆其他代码中的检查?