对Boost.Python导出的枚举进行序列化

5 投票
1 回答
1428 浏览
提问于 2025-04-16 01:03

有没有办法用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()

这样做的话,所有东西都能正常被序列化。

撰写回答