I am having trouble with NSKeyedArchiver. I create an archive with
archive = [NSDictionary dictionaryWithObjectsAndKeys: pruneTableP2, @"depth table", nil]; archiveData = [NSKeyedArchiver archivedDataWithRootObject: archive requiringSecureCoding: NO error: nil];
I then get a "The data isn’t in the correct format" error when I go to unarchive it with unarchivedObjectOfClass:. The subsequent call to a depreciated method works however.
archive = [NSKeyedUnarchiver unarchivedObjectOfClass: [NSDictionary class] fromData: fileData error: &error]; if( archive == nil ) { archive = [NSKeyedUnarchiver unarchiveObjectWithData: fileData]; NSLog( @"%@", [error localizedFailureReason]); }
What am I doing wrong?
Using the more explicit method: unarchivedDictionaryWithKeysOfClasses:objectsOfClasses:fromData:error: eliminates all the problems. The following code executes with no errors.
-(void)test: (NSString *)input { NSDictionary *source, *destination; NSSet *classes; NSMutableData *mData1, *mData2; NSData *table1, *table2, *archive; NSError *error; @autoreleasepool { mData1 = [NSMutableData dataWithData: edgeTableC3v]; mData2 = [NSMutableData dataWithData: cornerTableC3v]; table1 = mData1; table2 = mData2; source = [NSDictionary dictionaryWithObjectsAndKeys: input, @"input", table1, @"edge table", table2, @"corner table", nil]; archive = [NSKeyedArchiver archivedDataWithRootObject: source requiringSecureCoding: YES error: &error]; if( error != nil ) { [self report: [NSString stringWithFormat: @"\nError creating archive\n\t%@", [error localizedFailureReason]]]; } else { classes = [NSSet setWithObjects: [NSData class], [NSString class], nil]; destination = [NSKeyedUnarchiver unarchivedDictionaryWithKeysOfClasses: [NSSet setWithObject: [NSString class]] objectsOfClasses: classes fromData: archive error: &error]; if( error != nil) { [self report: [NSString stringWithFormat: @"\nError reading archive\n\t%@", [error localizedFailureReason]]]; } else [self report: [NSString stringWithFormat: @"\nNo Error\n%@", [destination description]]]; } [self reportDone]; } } OUTPUT No Error { "corner table" = {length = 2449440, bytes = 0x88a40000 e0970000 98c40000 48b70000 ... f3b00000 85a40000 }; "edge table" = {length = 145152, bytes = 0x00000000 00000000 140b0000 250a0000 ... 99090000 bf080000 }; input = Parameters; }
Note that I archived NSMutableData objects and they were unarchived with no error. The runtime doesn't send any warnings when unarchiving.