Название говорит все. Похоже, что было бы возможно (каким-то образом) реализовать травление на стороне питона для объектов PyObjC, чьи классы Objective-C реализуют NSCoding
без повторной реализации всего с нуля. Тем не менее, в то время как смысловые семантические члены, вероятно, были бы простыми, объектно-ориентированные графы объектов и условное кодирование могут быть сложными. Как вы можете заставить обе стороны «сотрудничать» с частями графа объекта?PyObjC: Как можно использовать NSCoding для реализации травления питона?
ответ
Не должно быть довольно просто?
На мариновании позвоните по телефону encodeWithCoder
по объекту, используя NSArchiver
или что-то в этом роде. Иметь колотушку для хранения этой строки.
При расклеивании используйте NSUnarchiver
, чтобы создать NSObject
из маринованной струны.
PyObjC поддерживает запись объектов Python в (с ключом) архив (то есть любой объект, который может быть маринован, реализует NSCoding).
Это, вероятно, самый простой способ сериализации произвольных графов объектов Python и Objective-C.
Как я писал в комментариях к другому ответу, я столкнулся с проблемами при попытке найти способ реализации поддержки pickle для любого объекта, который реализует NSCoding из-за несовместимости в том, как NSArchiver и pickle пересекают граф объекта (IIRC в первую очередь при восстановлении архив).
Это не работает для графов объектов, которые ссылаются на объекты ObjC на объекты Python. –
Я, к сожалению, забыл документировать проблемы, с которыми я столкнулся, когда пытался реализовать поддержку для травления произвольных объектов ObjC, поддерживающих протокол NSCoding. IIRC проблема связана с тем, как рассол и NSCoding пересекают граф объектов. Было довольно легко добавить поддержку NSCoding для любого объекта Python, который можно мариновать, но не наоборот. –
Если кто-нибудь найдет способ рассортировать объекты, реализующие протокол NScoding: сообщите мне о контролере PyObjC, так как мне бы хотелось, чтобы это поддерживалось в PyObjC. –