簡體   English   中英

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

[英]How to serialize a NSDictionary/NSArray/Property List (plist) which contains NSNull

我想使用NSNullNSMutableDictionary存儲一些空值,然后使用屬性列表序列化此數據。 問題是不允許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。 屬性列表具有一組固定的類型,並且不包括NSNull,並且不打算擴展。

以下是相關文檔的鏈接: NSCodingNSKeyedArchiverNSKeyedUnarchiver

不,沒有辦法將NSNull放在屬性列表中。 (瑣事:二進制屬性列表格式實際上支持空值,但編寫器未實現支持。)

對於字典,最簡單的解決方法是簡單地過濾掉空值,因此{foo =“ bar”; baz = null; }變成{foo =“ bar”; }。

從NSPropertyListSerializationClass的文檔中:

屬性列表對象。 plist必須是一種NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary對象。 容器對象還必須僅包含此類對象。

因此,您需要其中之一。 根據數據的類型,您可以放置​​一個占位符而不是NSNull,然后在加載.plist之前/之后進行一個處理(例如,使用零長度的NSData對象在plist中表示您的NSNull)。 究竟哪種占位符取決於您要存儲哪種數據,並選擇要避免的東西。 然后,在加載后,將空的NSData轉換回NSNull。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM