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

我想存储在NSMutableDictionary使用NSNull一些空值,然后使用属性列表序列化这些数据。 问题是NSNull是不允许的,我得到“属性列表格式无效”的错误。 有没有解决方法? 似乎很奇怪,他们没有把NSNull放在有效的plist对象列表中。

在序列化之前,我将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]; } 

不要使用属性列表,请考虑使用NSKeyedArchiver和NSKeyedUnarchiver。 属性列表有一个固定的types集合,不包括NSNull,它不能被扩展。

这里是相关文档的链接: NSCoding , NSKeyedArchiver和NSKeyedUnarchiver 。

不,没有办法把NSNull放在一个属性列表中。 (琐事:二进制属性列表格式实际上支持空值,但作者没有实现支持。)

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

从NSPropertyListSerializationClass的文档:

属性列表对象。 plist必须是一种NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary对象。 容器对象也只能包含这些types的对象。

所以你需要有一个。 根据数据的types,可以放置一个占位符而不是NSNull,然后在加载.plist之前/之后执行一个过程(例如,使用零长度NSData对象来表示您的NSNull在plist中)。 究竟是什么样的占位符取决于你正在存储什么样的数据,并select一些要避免的。 然后,加载后,将空的NSData翻译回NSNull。

Interesting Posts