[Pythonmac-SIG] NSKeyedArchiver and NSMutableArray
Jim Matthews
matthews at fetchsoftworks.com
Tue Jul 17 21:27:22 CEST 2007
I'm trying to learn PyObjC by translating the examples in Aaron
Hillegass's "Cocoa Programming for Mac OS X" to Python. I've run
into a problem with the archiving feature described in chapter 8. I
have an NSMutableArray of Person objects, where Person is a subclass
of NSObject. I can turn the array into an NSData object with
NSKeyedArchiver.archvedDataWithRootObject_(), but when I call
NSKeyedUnarchiver.unarchiveObjectWithData_() I get back an empty
array.
Any suggestions?
Here's simplified code that demonstrates the problem:
from Foundation import *
class Person(NSObject):
def init(self):
self = super(Person, self).init()
if self is None: return self
self.setPersonName_(u"New Person")
return self
def initWithCoder_(self, inCoder):
self = super(Person, self).init()
if self is None: return self
self.setPersonName_(inCoder.decodeObjectForKey_('personName'))
print 'Person.initWithCoder_ personName =', self.personName()
def encodeWithCoder_(self, inCoder):
print 'Person.encodeWithCoder_ personName =', self.personName()
inCoder.encodeObject_forKey_(self.personName(), 'personName')
def description(self):
return super(Person, self).description() + '(' +
self.personName() + ')'
def personName(self):
return self._personName
def setPersonName_(self, inPersonName):
self._personName = inPersonName
ma = NSMutableArray.alloc().init()
p1 = Person.alloc().init()
p1.setPersonName_('John Doe')
ma.insertObject_atIndex_(p1, 0)
print 'ma =', ma.description()
madata = NSKeyedArchiver.archivedDataWithRootObject_(ma)
decodedma = NSKeyedUnarchiver.unarchiveObjectWithData_(madata)
print 'decodedma =', decodedma.description()
--
Expected output:
ma = (<Person: 0x62e810>(John Doe))
Person.encodeWithCoder_ personName = John Doe
Person.initWithCoder_ personName = John Doe
decodedma = (<Person: 0x62e810>(John Doe))
Seen:
ma = (<Person: 0x62e810>(John Doe))
Person.encodeWithCoder_ personName = John Doe
Person.initWithCoder_ personName = John Doe
decodedma = ()
Thanks for any suggestions,
--
Jim Matthews
Fetch Softworks
http://fetchsoftworks.com
More information about the Pythonmac-SIG
mailing list