Сериализация объектов IronPython, которые наследуются от типов CLR - PullRequest
5 голосов
/ 17 сентября 2010

Это может быть немного странным вопросом, но есть ли надежный способ сериализации объектов 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 #?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

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

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

1 голос
/ 17 сентября 2010

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

IronPython не поддерживает Reflection основанные 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 наследует от Магазин и Аргумент_Клиника наследует от объект, все три класса разделяют тот же базовый тип CLR

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

...