对Boost.Python导出的枚举进行序列化
有没有办法用cPickle把一个通过Boost.Python暴露出来的枚举类型进行序列化?我之前成功地用这里描述的第一种方法序列化了其他对象,但这些方法好像不适用于枚举类型,而且这些对象默认似乎不能被序列化。
1 个回答
6
在模块里,它们并不是这样工作的。我了解到,这本来是应该可以做到的,但枚举(enum_)语句的工作方式让这变得不可能。
不过,你可以在Python这边找到解决办法。在某个地方(可能是在一个叫__init__.py的文件里),你可以这样做:
import yourmodule
def isEnumType(o):
return isinstance(o, type) and issubclass(o,int) and not (o is int)
def _tuple2enum(enum, value):
enum = getattr(yourmodule, enum)
e = enum.values.get(value,None)
if e is None:
e = enum(value)
return e
def _registerEnumPicklers():
from copy_reg import constructor, pickle
def reduce_enum(e):
enum = type(e).__name__.split('.')[-1]
return ( _tuple2enum, ( enum, int(e) ) )
constructor( _tuple2enum)
for e in [ e for e in vars(yourmodule).itervalues() if isEnumType(e) ]:
pickle(e, reduce_enum)
_registerEnumPicklers()
这样做的话,所有东西都能正常被序列化。