序列化从CLR类型继承的IronPython对象

时间:2010-09-17 09:21:14

标签: c# python serialization ironpython pickle

这可能是一个奇怪的问题,但有没有可靠的方法来序列化类扩展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对象的序列化?

2 个答案:

答案 0 :(得分:2)

我不知道你的目标是否正常,但你可以考虑protobuf(here)的python版本?我没有专门针对铁心进行过测试。这还有一个额外的好处,即C#实现可能有所帮助,同时保持平台独立性。如果可能,我希望获得protobuf-net以支持DLR类型,但这是一项很大的工作。

作为附注,我个人建议使用专用的DTO类型而不是尝试扩展内置类型。

答案 1 :(得分:1)

来自clrtype metaclasses

  

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手动序列化来解决这个问题。