Сериализация объектов IronPython, наследующих от типов CLR

Это может быть немного странный вопрос, но есть ли надежный способ сериализации объектов IronPython, классы которых расширяют типы CLR?

Например:

class Foo(System.Collections.Generic.List[str]):
    def Test(self):
        print "test!"

System.Collections.Generic.List<string> можно сериализовать с помощью Pickle, поскольку он реализует интерфейс ISerializable, но порожденные подклассы сериализуемых типов CLR, похоже, не работают, и я получаю ImportError: No module named Generic in mscorlib, Version=4 при запуске pickle.dumps(Foo()).

Вдобавок выполнение обычного Formatter.Serialize(stream, object) дает мне:

SystemError: Type 'IronPython.NewTypes.System.Collections.Generic.List`1_4$4' in Assembly Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Как я могу реализовать сериализацию объектов IronPython при работе во встроенной среде C #?


person Community    schedule 17.09.2010    source источник


Ответы (2)


Цитата из метаклассы clrtype

Сегодня IronPython не поддерживает API-интерфейсы или настраиваемые атрибуты на основе отражения, поскольку IronPython не генерирует настраиваемые типы среды CLR для каждого класса Python. Вместо этого он обычно использует один тип CLR для многих классов Python. Например, все три класса 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.

Я не пробовал, но, возможно, вы сможете решить эту проблему с помощью сериализации вручную с помощью суррогаты сериализации.

person desco    schedule 17.09.2010

Я не знаю, это то, что вам нужно, но вы можете рассмотреть версию protobuf для Python (здесь)? Я не тестировал это специально на ironpython, ум. Это имеет дополнительное преимущество, заключающееся в том, что существуют также реализации C #, которые могут помочь, сохраняя при этом независимость от платформы. По возможности я хочу, чтобы protobuf-net поддерживал типы DLR, но это большая работа.

В качестве побочного примечания, лично я бы рекомендовал иметь специальный тип DTO, а не пытаться расширить встроенные типы.

person Marc Gravell    schedule 17.09.2010
comment
Я просто использую System.Collections.Generic<string> в качестве примера - у меня есть собственные типы CLR в моей сборке, которые я реализовал ISerializable и которые я хочу сериализовать. - person ; 17.09.2010