Поскольку сообщение об ошибке, которое вы сейчас получаете, пытается вам сказать, вы пытаетесь выбрать экземпляры, которые не могут быть выбраны (в древнем устаревшем протоколе рассылки, который вы сейчас используете), потому что их класс определяет __slots__
, но не метод __getstate__
.
Однако даже изменение их класса не поможет, потому что тогда вы столкнетесь с другой проблемой - которую вы уже правильно определили как вероятную из-за динамически генерируемых классов. Все протоколы pickle
сериализуют классы (и функции) «по имени», по существу ограничивая их нахождение в именах верхнего уровня в своих модулях. И, если сериализация экземпляра абсолютно , то требует сериализации класса (как еще вы могли бы восстановить экземпляр позже, если класса не было рядом?!).
Таким образом, вам нужно будет сохранить и перезагрузить данные другим способом, сломав текущую прямую зависимость от конкретных классов в suds.sudsobject
в пользу зависимости от интерфейса (либо формализованного, либо просто определенного с помощью утилитного ввода), который может быть реализованы как такими конкретными классами, когда вы фактически обращаетесь к SOAP-серверу, так и более простыми «домашними», когда вы загружаете данные из файла. (Данные, представляющие состояние экземпляра, без сомнения, могут быть представлены как dict, так что вы можете принудительно вызвать их через pickle, если вы действительно хотите, например, с помощью модуля copy_reg
, который позволяет вам настраивать протоколы сериализации / десериализации для объектов, которые вы вызываете относиться неинвазивно [[так что вы не можете добавлять __getstate__
или тому подобное к их классам]] - проблема возникнет только в том случае, если среди таких объектов будет обширная сетка взаимных ссылок).