NSCoding
能够完全满足你的需求。我建议你在 Apple 文档中了解一下它,但我认为它很容易使用。你的类(以及任何子类)都需要实现 NSCoding
协议,并且你需要向你的对象添加 -encodeWithCoder:
和 -initWithCoder:
方法。大多数常见的框架类已经实现了 NSCoding
。
你的类的代码将看起来像这样:
-(void) encodeWithCoder: (NSCoder*) coder {
[coder encodeInteger: versionValue forKey: versionKey];
[coder encodeObject: myStuff forKey: myStuffKey];
}
-(id) initWithCoder: (NSCoder*) coder {
self = [super init];
if ( ! self) return nil;
myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
return self;
}
建议在编码时添加版本号,以便在将来的版本中管理归档格式的更改。
在我的类中,我添加了一个方便的方法来归档我的对象:
-(void) archiveToFile: (NSString*) path {
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
[archiver encodeObject: self forKey: myArchiveKey];
[archiver finishEncoding];
[archiver release];
[data writeToFile: path atomically: YES];
[data release];
}
再加上一个用于取消归档或创建新对象的代码:
+(MyArchive*) newFromFile: (NSString*) path
orWithMyStuff: (MyStuff*) myStuff
{
NSData *data = [[NSData alloc] initWithContentsOfFile: path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
[unarchiver finishDecoding];
if (myArchive) {
[myArchive retain];
} else {
myArchive = [[MyArchive alloc] initWithStuff: myStuff;
}
[unarchiver release];
[data release];
return myArchive;
}
由于您的顶级对象是 NSArray
,因此您需要针对您的情况修改最后两个方法,但大部分样板代码将保持不变。