URL: <http://savannah.gnu.org/bugs/?func=detailitem&item_id=15226>
Summary: Unarchived objects do not equal archived objects Project: GNUstep Submitted by: kokosmakrone Submitted on: Do 15.12.2005 um 23:33 Category: Base/Foundation Severity: 3 - Normal Item Group: Bug Status: None Privacy: Public Assigned to: None Open/Closed: Open _______________________________________________________ Details: Take the following scenario into account: You store/archive a string in a NSData d1 object. Afterwards you run a query and want to load this string by loading/unarchiving. After, you want this previously loaded string being stored in another NSData d2 object. You would expect that the content of d2 equals d1 which is not the case. Behind the scene: The first string is being allocated as an instance of GSInlineString. Encoding and afterwards decoding this object returns an instance of GSUnicodeBufferString. Encoding this instance seems to differ from encoding an instance of GSInlineString. The following code shows this bug when leaving KEYED_ARCHIVER undefined. Defining it shows the potential workaround (which costs much more space): //#define KEYED_ARCHIVER 1 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *sOriginal, *sLoaded; NSMutableData *dataOriginal, *dataLoaded; #if defined(KEYED_ARCHIVER) NSKeyedArchiver *arOriginal, *arLoaded; #else NSArchiver *arOriginal, *arLoaded; #endif char *b1, *b2; sOriginal = [[[NSString alloc] initWithString: @"bla"] autorelease]; dataOriginal = [[[NSMutableData alloc] init] autorelease]; #if defined(KEYED_ARCHIVER) arOriginal = [[[NSKeyedArchiver alloc] initForWritingWithMutableData: dataOriginal] autorelease]; #else arOriginal = [[[NSArchiver alloc] initForWritingWithMutableData: dataOriginal] autorelease]; #endif #if defined(KEYED_ARCHIVER) [arOriginal encodeObject: sOriginal forKey: @"bla"]; #else [arOriginal encodeObject: sOriginal]; #endif #if defined(KEYED_ARCHIVER) [arOriginal finishEncoding]; #endif #if defined(KEYED_ARCHIVER) arOriginal = [[[NSKeyedUnarchiver alloc] initForReadingWithData: dataOriginal] autorelease]; #else arOriginal = [[[NSUnarchiver alloc] initForReadingWithData: dataOriginal] autorelease]; #endif #if defined(KEYED_ARCHIVER) sLoaded = [[[arOriginal decodeObjectForKey: @"bla" ] retain] autorelease]; #else sLoaded = [[[arOriginal decodeObject] retain] autorelease]; #endif NSLog( @"LOADED: %@", sLoaded ); dataLoaded = [[[NSMutableData alloc] init] autorelease]; #if defined(KEYED_ARCHIVER) arLoaded = [[[NSKeyedArchiver alloc] initForWritingWithMutableData: dataLoaded] autorelease]; #else arLoaded = [[[NSArchiver alloc] initForWritingWithMutableData: dataLoaded] autorelease]; #endif #if defined(KEYED_ARCHIVER) [arLoaded encodeObject: sLoaded forKey: @"bla" ]; #else [arLoaded encodeObject: sLoaded ]; #endif #if defined(KEYED_ARCHIVER) [arLoaded finishEncoding]; #endif NSLog( @"Length: orginal=%d, loaded=%d", [dataOriginal length], [dataLoaded length] ); if( [dataOriginal length] != [dataLoaded length] ) { NSLog( @"Data differs!" ); } else { BOOL buffersAreEqual = YES; int i; b1 = [dataOriginal bytes]; b2 = [dataLoaded bytes]; for( i = 0; i < [dataOriginal length]; i++ ) { if( b1[ i ] != b2[ i ] ) { buffersAreEqual = NO; break; } } if( buffersAreEqual ) { NSLog( @"Buffers are equal!" ); } else { NSLog( @"Buffers DIFFER!" ); } } exit( 0 ); _______________________________________________________ Reply to this item at: <http://savannah.gnu.org/bugs/?func=detailitem&item_id=15226> _______________________________________________ Nachricht geschickt von/durch Savannah http://savannah.gnu.org/ _______________________________________________ Bug-gnustep mailing list Bug-gnustep@gnu.org http://lists.gnu.org/mailman/listinfo/bug-gnustep