Re: Archiving objects without their owner[1]
Re: Archiving objects without their owner[1]
- Subject: Re: Archiving objects without their owner[1]
- From: Dan Bernstein <email@hidden>
- Date: Thu, 20 Dec 2001 09:14:00 +0200
On Thursday, December 20, 2001, at 06:14 AM, Andre Lipinski wrote:
On Wednesday, December 19, 2001, at 01:59 AM, Dan Bernstein wrote:
On Wednesday, December 19, 2001, at 06:30 AM, Andre Lipinski wrote:
If you'd like to just handle one owner per archive, it's real easy,
use replaceObject:[NSNull null] withObject: then decode the root
object.
With multiple replaced things it's more tricky if you'd like some
tips, please email.
Andre.
Thanks.
However, it doesn't seem to work for me. Here's what I did for
archiving:
NSArchiver *myArchiver = [[[NSArchiver alloc]
initForWritingWithMutableData:[NSMutableData data]] autorelease];
[myArchiver replaceObject:self withObject:[NSNull null]];
[myArchiver encodeRootObject:theRootObject];
I then store [myArchiver archiverData]. Here's how I unarchive:
NSUnarchiver *myUnarchiver = [[[NSUnarchiver alloc]
initForReadingWithData:theData] autorelease];
[myUnarchiver replaceObject:[NSNull null] withObject:self];
theRootObject = [myUnarchiver decodeObject];
Yet the unarchived object contains pointers to <null> instead of to
the object doing the unarchiving.
What's wrong?
Hmmmmm. The pointers are NULL or nil, not [NSNull null]? Alright, try
something more complicated which will also work for multiple
replacements.
I'm sorry. They were [NSNull null]. Now I did this:
id placeHolder = @"ownerPH"
NSArchiver *myArchiver = [[[NSArchiver alloc]
initForWritingWithMutable
Data:[NSMutableData data]] autorelease];
[myArchiver encodeObject:placeHolder];
[myArchiver replaceObject:self withObject:placeHolder];
[myArchiver encodeRootObject:theRootObject];
I then store [myArchiver archiverData]. Here's how I unarchive:
NSUnarchiver *myUnarchiver = [[[NSUnarchiver alloc]
initForReadingWith
Data:theData] autorelease];
id placeHolder = [myUnarchiver decodeObject];
[myUnarchiver replaceObject:placeHolder withObject:self];
theRootObject = [myUnarchiver decodeObject];
Which results in @"ownerPH" being unarchived back into placeHolder, but
also in all the pointers pointing to it, rather than to self, i.e. my
[NSUnarchiver replaceObject:withObject:] is simply ignored :-(
Dan
Create something like a dictionary with object pairs of strings &
strings replace each object with one of these string objects archive
the dictionary first.
When unarchiving take the dictionary and perform object replacements on
the string objects in the dictionary.
Andre.