这可能是一个奇怪的问题,但有没有可靠的方法来序列化类扩展CLR类型的IronPython对象?
例如:
class Foo(System.Collections.Generic.List[str]):
def Test(self):
print "test!"
System.Collections.Generic.List<string>
可以使用Pickle进行序列化,因为它实现了ISerializable
接口,但是可序列化CLR类型的发布子类似乎不起作用,并且在运行{{1}时得到ImportError: No module named Generic in mscorlib, Version=4
}。
此外,运行通常的pickle.dumps(Foo())
会给我:
Formatter.Serialize(stream, object)
如何在嵌入式C#环境中运行时实现IronPython对象的序列化?
答案 0 :(得分:2)
我不知道你的目标是否正常,但你可以考虑protobuf(here)的python版本?我没有专门针对铁心进行过测试。这还有一个额外的好处,即C#实现可能有所帮助,同时保持平台独立性。如果可能,我希望获得protobuf-net以支持DLR类型,但这是一项很大的工作。
作为附注,我个人建议使用专用的DTO类型而不是尝试扩展内置类型。
答案 1 :(得分:1)
IronPython不支持Reflection 今天基于API或自定义属性 因为IronPython不会发出一个 每个Python的自定义CLR类型 类。相反,它通常共享一个 许多Python中的单一CLR类型 类。例如,全部三个 这些Python类共享一个 基础CLR类型。
class shop(object):
pass
class cheese_shop(shop):
def have_cheese(self, cheese_type):
return False
class argument_clinic(object):
def is_right_room(self, room=12):
return "I've told you once"
import clr
print clr.GetClrType(shop).FullName
print clr.GetClrType(cheese_shop).FullName
print clr.GetClrType(argument_clinic).FullName
即使cheese_shop继承自 shop和argument_clinic继承自 对象,所有三个类共享 相同的基础CLR类型
我还没试过,但也许您可以通过serialization surrogates手动序列化来解决这个问题。