Я хочу сохранить в NSMutableDictionary
несколько нулевых значений, используя NSNull
, а затем сериализуем эти данные, используя список свойств. Проблема NSNull
не разрешена, и я получаю ошибку «Список свойств в недопустимом формате». Есть ли обходной путь для этого? Кажется очень удивительным, что они не положили NSNull
в список действительных объектов plist.Как сериализовать NSDictionary/NSArray/Список свойств (plist), который содержит NSNull
ответ
Нет, не существует способа разместить NSNull
в списке объектов. (Trivia: формат списка бинарных свойств фактически поддерживает нули, но писатель не реализует поддержку.)
Для словаря самым простым обходным путем является простое отбрасывание нулевых значений, поэтому {foo = "bar"; baz = null; } становится {foo = "bar"; }.
Это не одно и то же так как мне нужны нулевые значения, чтобы указать, что ключ существует, но не имеет соответствующих значений (т. е. я уже знаю, что есть ключ без данных, а не его новый ключ, о котором я не знаю). – 2009-08-07 12:54:57
Возможно, вы могли бы сериализовать как A) словарь с помощью только ключей, имеющих соответствующее значение, так и B) массив всех известных ключей, независимо от того, имеют ли они данные. В конечном счете, невозможно напрямую установить NSNull в plist, поэтому вам нужно найти обходной путь. –
Из документации NSPropertyListSerializationClass:
Объект списка свойств. plist должен быть вид NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary объект. Контейнерные объекты также должны содержать только такие объекты.
Поэтому у вас должен быть один из них. В зависимости от типа данных вы можете помещать заполнитель вместо NSNull, а затем выполнять процесс до/после загрузки .plist (например, используя объект NSData с нулевой длиной для представления вашего NSNull в plist). Именно то, что заполнитель будет зависеть от того, какие данные вы храните, и выбирая что-то, чего следует избегать. Затем, после загрузки, переведите пустой NSData обратно в NSNull.
Серьезно, что не так с программистами Apple ??? Мне не нравится писать такой код. – 2009-08-07 12:53:22
DD, если вам нужна общая сериализация, используйте NSCoder. Списки свойств имеют фиксированный набор типов, поэтому независимо от того, насколько далеко он расширен, всегда будет необходимо что-то конвертировать. –
Если вам не нравятся ограничения списков свойств (которые не могут поддерживать NSNull, как указано в документации), не используйте списки свойств. Как предлагает другой комментатор, используйте свой собственный формат сериализации. Поддержка NSPropertyList! = Сериализация. – AlBlue
Вместо использования списка свойств рассмотрите использование NSKeyedArchiver и NSKeyedUnarchiver. Списки свойств имеют фиксированный набор типов, и это не включает NSNull, и он не предназначен для расширения.
Здесь приведены ссылки на соответствующую документацию: NSCoding, NSKeyedArchiver и NSKeyedUnarchiver.
Я конвертирую NSArray или NSDictionary в NSData перед сериализацией. Ниже приведена категория nsarray для сериализации и десериализации. Это comfortableby обрабатывает некоторые данные будучи 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];
}
Очень хорошо! Удивительно, что это работает (что я только что проверил), когда более распространенные методы в ключах нет. –
- 1. Сериализовать в XML объект, который содержит IList
- 2. Сериализовать Keyedcollection, который содержит другой keyedcollection
- 3. plist array null, хотя plist содержит строку
- 4. Plist содержит символ «&»
- 5. Как сериализовать/десериализовать объект GTLDriveFile в pList
- 6. Как сериализовать класс содержит BitmapImage?
- 7. Сериализовать объект для JSON, который уже содержит одно свойство JSON
- 8. Обработка NSNull для значений свойств NSManagedObject
- 9. Как сохранить datatable, если он содержит объект, который отказывается сериализовать?
- 10. Как сериализовать/deserialze в json объект, который содержит int []?
- 11. Сериализовать/Deserialize различные имена свойств?
- 12. Сериализовать объект класса, который содержит секретные данные - сериализация с шифрованием
- 13. Сериализовать в django с набором запросов, который содержит defer
- 14. Является ли NSNull равным NSNull
- 15. Как отсортировать NSArray, который содержит NSDictionary?
- 16. Сериализовать список, который содержит массивы и другие списки
- 17. Как сериализовать POCO с желаемыми именами свойств
- 18. Как обрабатывать значения NSNull
- 19. Как де-сериализовать POJO содержит HashTable?
- 20. Совместимость JSON и списка свойств (plist)?
- 21. NSDictionary содержащего NSNull *
- 22. Сериализующий объект, который содержит значение циклического объекта
- 23. Список свойств apple (plist) в C++
- 24. Сохранение файла NaN в списке свойств (plist)
- 25. Как установить законность элемента, который содержит код, который содержит модель?
- 26. Почему интерфейс не содержит свойств
- 27. Как сериализовать объект, который включает BufferedImages
- 28. Как проверить объект содержит набор свойств
- 29. Тестирование равенства NSNull
- 30. как загружать данные Plist в массив в списке свойств IOS
Ответ предоставляется Saurabh Wadhwa работает просто замечательно, я просто использовал это сам, слишком плохо оригинального плаката не вокруг, чтобы принять его ... –