2011-11-25 3 views
0

NSKeyedArchiver를 사용하여 blob이라는 객체를 저장하려고합니다. NSMutableData와 NSKeyedArchiver를 사용하여 해당 개체를 나타내는 파일에 데이터를 저장합니다. 그렇다면 NSData와 NSKeyedUnarchiver를 사용하여 파일에서 데이터를 가져옵니다.NSKeyArchiver를 사용하여 데이터를 저장하지만 NSKeyUnarchiver를 사용하여 데이터를로드 할 때 모두 0 또는 nil이됩니다.

오류없이 정상적으로 작동하지만로드 할 때 모든 속성이 "0"또는 nil입니다.

왜 이런가요? 당신이 encodeInt:forKey: 사용하면 decodeIntForKey:를 사용해야하는 경우

b.health = [unarchiver decodeIntForKey:@"health"]; 

b.health = [[unarchiver decodeObjectForKey:@"health"]intValue]; 

처럼

-(void) LoadBlobs 
{ 
    [blobs release]; 
    blobs = nil; 
    blobs = [[NSMutableArray alloc]init]; 
    NSNumber *blobAmounts = [[NSUserDefaults standardUserDefaults]objectForKey:blobAmount]; 

    if([blobAmounts intValue] <= 0) 
    { 
     return; 
    } 

    for(int i = 0; i < [blobAmounts intValue]; i++) 
    { 
     NSLog(@"Loading Blob #%i...", i); 
     NSString *curBlobDirectory = [[NSString alloc]initWithFormat:@"%@%i", saveDirectoryBlobs, i]; 
     NSLog(@"Blob directory is: %@", curBlobDirectory); 

     NSData *blobData = [[NSData alloc]initWithContentsOfFile:curBlobDirectory]; 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:blobData]; 

     Blob *b = [[Blob alloc]initWithFile:@"Blob.png"]; 
     b.position = CGPointMake([[unarchiver decodeObjectForKey:@"x"]intValue], [[unarchiver decodeObjectForKey:@"y"]intValue]); 
     b.health = [[unarchiver decodeObjectForKey:@"health"]intValue]; 
     b.mating = [[unarchiver decodeObjectForKey:@"mating"]intValue]; 
     b.aiEntity = [[unarchiver decodeObjectForKey:@"entity"]intValue]; 
     b.action = [[unarchiver decodeObjectForKey:@"action"]intValue]; 
     b.faction = [[unarchiver decodeObjectForKey:@"faction"]intValue]; 
     b.equippedHelmet = [[unarchiver decodeObjectForKey:@"helmet"]boolValue]; 
     b.equippedSpear = [[unarchiver decodeObjectForKey:@"spear"]boolValue]; 
     b.goingTo = CGPointMake([[unarchiver decodeObjectForKey:@"gx"]intValue], [[unarchiver decodeObjectForKey:@"gy"]intValue]); 
     b.homeID = [[unarchiver decodeObjectForKey:@"home"]intValue]; 
     b.aiID = [[unarchiver decodeObjectForKey:@"ai"]intValue]; 
     b.iD = [[unarchiver decodeObjectForKey:@"id"]intValue]; 

     NSLog(@"Blob #%i properties are: %f, %i, %i, %i, %i, %i, %i", i, b.health, b.mating, b.aiEntity, b.faction, b.action, b.equippedHelmet, b.equippedSpear); 

     [blobs addObject:b]; 
     [self addChild:b z:1]; 

     [unarchiver finishDecoding]; 

     [blobData release]; 
     [curBlobDirectory release]; 
     [unarchiver release]; 
    } 
    NSLog(@"%i blobs successfully loaded!", [blobs count]); 
} 

-(void) SaveBlobs 
{ 
    [[NSUserDefaults standardUserDefaults]setValue:[NSNumber numberWithBool:true] forKey:gameSavedPrev]; 

    int i = 0; 
    for(Blob *b in blobs) 
    { 
     NSLog(@"Saving Blob #%i...", i); 

     NSString *curBlobDirectory = [[NSString alloc]initWithFormat:@"%@%i", saveDirectoryBlobs, i]; 

     NSMutableData *blobData = [[NSMutableData alloc]init]; 
     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:blobData]; 

     [archiver encodeInt:b.position.x forKey:@"x"]; 
     [archiver encodeInt:b.position.y forKey:@"y"]; 
     [archiver encodeInt:b.health forKey:@"health"]; 
     [archiver encodeInt:b.mating forKey:@"mating"]; 
     [archiver encodeInt:b.aiEntity forKey:@"entity"]; 
     [archiver encodeInt:b.action forKey:@"action"]; 
     [archiver encodeInt:b.faction forKey:@"faction"]; 
     [archiver encodeBool:b.equippedHelmet forKey:@"helmet"]; 
     [archiver encodeBool:b.equippedSpear forKey:@"spear"]; 
     [archiver encodeInt:b.position.x forKey:@"gx"]; 
     [archiver encodeInt:b.position.y forKey:@"gy"]; 
     [archiver encodeInt:b.homeID forKey:@"home"]; 
     [archiver encodeInt:b.aiID forKey:@"ai"]; 
     [archiver encodeInt:b.iD forKey:@"id"]; 

     [archiver finishEncoding]; 

     BOOL success = [blobData writeToFile:curBlobDirectory atomically:YES]; 
     NSLog(@"Blob directory is: %@", curBlobDirectory); 

     [archiver release]; 
     [blobData release]; 
     [curBlobDirectory release]; 

     i++; 
    } 
} 

답변

1

교체 다.
encodeBool:forKey: you have to use decodeBoolForKey :`를 사용하는 경우.

등등

+0

매우 긴 질문에 답변 해 주셔서 감사합니다. 나는 지금 당장 이것을 시도 할 것이다, 고마워! (많은 코드 읽기 에서처럼) – Telinir