pickleing/unpickling替换(与API兼容)类实现
Pickling/unpickling alternative (API-compatible) class implementations
在分布式计算项目中,我们使用Pyro通过节点之间的连线传递对象;Pyro使用pickle在内部序列化和反序列化对象。
项目中的一些类有两种实现:一种是纯Python(为了便于安装,尤其是对于Windows用户),另一种是c++/boost::Python(速度更快,但需要boost+了解如何编译扩展模块)。python和c++类都支持pickle(在c++中,这是通过boost::python完成的)。
这些类具有不同的完全限定名称(mupif.Octree.Octant
与mupif.fastOctant.Octant
),但后者与前者别名,并覆盖纯Python定义(mupif.Octree.Octant=mupif.fastOctant.Octant
),因此它对用户是透明的,并且如果节点上可用,则始终使用快速变体。
然而,pickle使用__module__
和__class__
来标识实例,因此,当基于c++的对象通过连线传递给另一个不支持它的节点时,取消pickle将失败。
解决这个问题的办法是什么?是否可以更改类的__module__
,即foo.fastOctant.Octant.__class__.__module__='mupif.Octree'
?它会有一些我还没有看到的副作用吗?
如果没有可用的快速实现,用另一种方式别名(fast=normal)有帮助吗?也许这只能在取消拾取然后反转的时候进行,以避免混淆其他代码中的检查?
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 在 Matlab 中非递归实现 perms,与 Coder 兼容
- 我们应该如何实现std::error_code兼容的API
- C++中实现文件中的声明不兼容
- std::vector的自包含、STL兼容实现
- pickleing/unpickling替换(与API兼容)类实现
- 测试容器是否实现.at()成员访问/ std::sort兼容的正确方法
- 说出一个实现STL兼容序列容器的好指南)
- 异常规范在声明和功能实现方面不兼容