如何序列化包含NSNull的NSDictionary/NSArray/Property List(plist)

12 cocoa serialization objective-c ios

我想存储NSMutableDictionary一些空值NSNull,然后使用属性列表序列化这些数据.问题是NSNull不允许的,我得到"属性列表格式无效"错误.这有解决方法吗?似乎非常令人惊讶的是他们没有NSNull列入有效的plist对象列表.

Sau*_*hwa 14

我在序列化之前将NSArray或NSDictionary转换为NSData.以下是nsarray上用于序列化和反序列化的类别.这舒适处理一些数据是nsnull

@implementation NSArray(Plist)

-(BOOL)writeToPlistFile:(NSString*)filename{
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
    return didWriteSuccessfull;
}

+(NSArray*)readFromPlistFile:(NSString*)filename{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    NSData * data = [NSData dataWithContentsOfFile:path];
    return  [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ess 9

请考虑使用NSKeyedArchiver和NSKeyedUnarchiver,而不是使用属性列表.属性列表具有一组固定的类型,并且不包括NSNull,并且不打算进行扩展.

以下是相关文档的链接:NSCoding,NSKeyedArchiverNSKeyedUnarchiver.


Jen*_*ton 5

不,没有办法放入NSNull财产清单.(Trivia:二进制属性列表格式实际上支持空值,但编写器不实现支持.)

对于字典,最简单的解决方法是简单地过滤掉空值,所以{foo ="bar"; baz = null; 变成{foo ="bar"; }.