Сериализация объектов 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
когда running 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 #?
- Установка цвета текста RichEdit из другого процесса
- Использование сохраненного оценщика Tensorflow с C ++ API
- Самый быстрый способ отправить длинную строку из C # в Python
- Отмена экспортных функций в Python
- ctypes: Кастовать строку для работы?
Цитата из метаклассов 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 и arguments_clinic наследует от объекта, все три класса имеют один и тот же базовый тип CLR
Я не пробовал, но, может быть, вы можете решить эту проблему с помощью ручной сериализации через суррогаты сериализации .
Я не знаю, если это то, что вам нужно, но вы можете рассмотреть версию protobuf python ( здесь )? Разумеется, я не тестировал его конкретно на железе. Это дает дополнительное преимущество в том, что существуют также реализации C #, которые могут помочь, сохраняя при этом независимость от платформы. Когда это возможно, я хочу, чтобы protobuf-net поддерживал типы DLR, но это большая работа.
В качестве побочного примечания, лично я бы рекомендовал иметь выделенный тип DTO, а не пытаться расширить встроенные типы.
- Каковы плюсы и минусы хранения данных сеанса в файлах с базами данных?
- Как сделать ropemacs быстрее в emacs?
- Никогда не используйте отражение в производственном коде! Как насчет Python?
- Mutable / immutable объекты в Python и C / C ++
- Как открыть класс C ++ для Python без создания модуля
- Ускорение работы Python с C ++
- Идиоматический способ сделать список / dict в Cython?
- При встраивании python в другое приложение, как мне импортировать или вызывать функцию в подмодуле (например, scipy.optimize.nnls)?
- Реализация квад-сетчатого поколения для произвольного четырехстороннего
- изменение значения аргумента в коде C ++ / Python
- Python: как упаковать различные типы данных в строковый буфер, используя struct.pack_into