1
My NSMutableArray實例包含具有共同祖先的不同類型對象的實例。我想序列化數組,但NSKeyedArchiver類似乎是將數組包含某些類型的對象。有股票序列化類的簡單方法嗎?Objective-c對包含不同類型的數組進行序列化的方式
My NSMutableArray實例包含具有共同祖先的不同類型對象的實例。我想序列化數組,但NSKeyedArchiver類似乎是將數組包含某些類型的對象。有股票序列化類的簡單方法嗎?Objective-c對包含不同類型的數組進行序列化的方式
我不認爲NSKeyedArchiver是你的問題,因爲它不知道數組或任何東西。也許你需要在每個子類上實現NSCoding協議?
編輯:
不知道你是如何使用您的NSKeyedArchiver,但是這是你應該如何使用它:
NSMutableData *data = [NSMutableData new];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:array forKey:@"array"];
[data writeToFile:filename attomically:YES];
[archiver release];
[data release];
後來讀它:
NSData *data = [[NSData alloc] initWithContentsOfFile:filename];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
array = [[unarchiver objectForKey:@"array"] retain];
[unarchiver release];
[data release];
這裏假定array
是某種類型的NSObject
,包括NSArray
,NSSet
,NSDictionary
等,或其任何可變等價物。
我已經實現NSCoding協議,但編碼器實例只有「encodeArrayOfObjCType:count:at」方法,它需要顯式傳遞元素的類型。我錯過了什麼嗎? –
是的,你錯過了一些東西,每個類只需要自己編碼。 NSMutableArray已經知道如何自我存檔(它對一個計數進行編碼,然後對所有包含的對象進行編碼)。所以你所要做的就是在你使用的每個子類中實現initWithCoder:和encodeWithCoder:。你不需要顯式編碼數組,如果你的子類有這樣的實例變量,只需使用encodeObject:forKey:進行編碼,它就可以在任何實現NSCoder協議的類上工作,包括NSMutableArray。 – PeyloW
謝謝Ed和Peylow,我想我必須使用上面提到的方法來序列化數組,並沒有注意到他們也實現了NSCoder協議。 –