Как сериализовать NSDictionary / NSArray / Список свойств (plist), который содержит NSNull - PullRequest
12 голосов
/ 07 августа 2009

Я хочу сохранить в NSMutableDictionary некоторые нулевые значения, используя NSNull, а затем сериализовать эти данные, используя список свойств. Проблема NSNull не разрешена, и я получаю сообщение об ошибке «Список свойств в недопустимом формате». Есть ли обходной путь для этого? Кажется очень удивительным, что они не поместили NSNull в список допустимых объектов plist.

Ответы [ 4 ]

14 голосов
/ 26 апреля 2012

Я преобразовываю 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];
}
9 голосов
/ 07 августа 2009

Вместо использования списка свойств рассмотрите возможность использования NSKeyedArchiver и NSKeyedUnarchiver. Списки свойств имеют фиксированный набор типов, который не включает NSNull и не предназначен для расширения.

Вот ссылки на соответствующую документацию: NSCoding , NSKeyedArchiver и NSKeyedUnarchiver .

5 голосов
/ 07 августа 2009

Нет, нет возможности поместить NSNull в список свойств. (Общая информация: формат списка двоичных свойств фактически поддерживает значения NULL, но средство записи не поддерживает).

Для словаря самый простой обходной путь - просто отфильтровать нулевые значения, поэтому {foo = "bar"; баз = ноль; } становится {foo = "bar"; }.

3 голосов
/ 07 августа 2009

Из документации NSPropertyListSerializationClass:

Объект списка свойств. Плист должен быть своего рода NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary объект. Контейнерные объекты также должны содержат только эти виды объектов.

Так что вам нужно иметь один из них. В зависимости от типа данных, вы можете поместить заполнитель вместо NSNull, а затем выполнить процесс до / после загрузки .plist (как, например, использование объекта NSData нулевой длины для представления NSNull в plist). Какой именно заполнитель будет зависеть от того, какие данные вы храните, и от выбора чего-то, чего следует избегать. Затем после загрузки переведите пустые NSData обратно в NSNull.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...