2014-02-12 1 views
2

Название говорит все. Похоже, что было бы возможно (каким-то образом) реализовать травление на стороне питона для объектов PyObjC, чьи классы Objective-C реализуют NSCoding без повторной реализации всего с нуля. Тем не менее, в то время как смысловые семантические члены, вероятно, были бы простыми, объектно-ориентированные графы объектов и условное кодирование могут быть сложными. Как вы можете заставить обе стороны «сотрудничать» с частями графа объекта?PyObjC: Как можно использовать NSCoding для реализации травления питона?

ответ

0

Не должно быть довольно просто?

На мариновании позвоните по телефону encodeWithCoder по объекту, используя NSArchiver или что-то в этом роде. Иметь колотушку для хранения этой строки.

При расклеивании используйте NSUnarchiver, чтобы создать NSObject из маринованной струны.

+0

Это не работает для графов объектов, которые ссылаются на объекты ObjC на объекты Python. –

+1

Я, к сожалению, забыл документировать проблемы, с которыми я столкнулся, когда пытался реализовать поддержку для травления произвольных объектов ObjC, поддерживающих протокол NSCoding. IIRC проблема связана с тем, как рассол и NSCoding пересекают граф объектов. Было довольно легко добавить поддержку NSCoding для любого объекта Python, который можно мариновать, но не наоборот. –

+2

Если кто-нибудь найдет способ рассортировать объекты, реализующие протокол NScoding: сообщите мне о контролере PyObjC, так как мне бы хотелось, чтобы это поддерживалось в PyObjC. –

1

PyObjC поддерживает запись объектов Python в (с ключом) архив (то есть любой объект, который может быть маринован, реализует NSCoding).

Это, вероятно, самый простой способ сериализации произвольных графов объектов Python и Objective-C.

Как я писал в комментариях к другому ответу, я столкнулся с проблемами при попытке найти способ реализации поддержки pickle для любого объекта, который реализует NSCoding из-за несовместимости в том, как NSArchiver и pickle пересекают граф объекта (IIRC в первую очередь при восстановлении архив).