Chcę przechowywać w NSMutableDictionary
niektóre wartości null przy użyciu NSNull
, a następnie serializować te dane za pomocą listy właściwości. Problem jest NSNull
jest niedozwolony i pojawia się komunikat "Lista właściwości jest w nieprawidłowym formacie". Czy istnieje obejście tego problemu? Wydaje się bardzo zaskakujące, że nie umieścili NSNull
na liście poprawnych obiektów plist.Jak serializować NSDictionary/NSArray/Property List (plist), która zawiera NSNull
Odpowiedz
Nie, nie ma możliwości umieszczenia NSNull
na liście właściwości. (Ciekawostka: format listy właściwości binarnych faktycznie obsługuje wartości null, ale program piszący nie obsługuje obsługi.)
W przypadku słownika najłatwiejszym rozwiązaniem jest po prostu odfiltrowanie wartości pustych, więc {foo = "bar"; baz = null; } staje się {foo = "bar"; }.
To nie dokładnie to samo ponieważ potrzebuję wartości null, aby wskazać, że klucz istnieje, ale nie ma odpowiednich wartości (tj. już wiem, że istnieje klucz bez danych, w przeciwieństwie do nowego klucza, o którym nie wiem). –
Być może możesz serializować zarówno A) słownik z tylko kluczami, które mają odpowiednią wartość, jak i B) tablicę wszystkich znanych kluczy, niezależnie od tego, czy mają one dołączone dane. Ostatecznie nie ma możliwości umieszczenia NSNull bezpośrednio w plist, więc musisz znaleźć obejście. –
Z dokumentacji NSPropertyListSerializationClass:
Lista właściwość obiektu. plist musi być rodzaj obiektu NSData, NSString, NSNumber, NSDate, NSArray lub NSDictionary . Obiekty kontenerów muszą również zawierać tylko te rodzaje obiektów.
Musisz mieć jedno z nich. W zależności od typu danych można wstawić symbol zastępczy zamiast NSNull, a następnie wykonać proces przed/po załadowaniu .plist (jak na przykład użycie obiektu NSData o zerowej długości do reprezentowania NSNull w plist). Dokładnie jaki rodzaj elementu zastępczego będzie zależny od rodzaju danych, które przechowujesz, i wyboru czegoś, czego chcesz uniknąć. Następnie, po załadowaniu, przetłumacz pustą NSData z powrotem na NSNull.
Poważnie, co jest nie tak z programistami Apple? Nienawidzę pisać takiego kodu. –
DD, jeśli chcesz serializacji ogólnej, użyj NSCoder. Listy właściwości mają ustalony zestaw typów, więc niezależnie od tego, jak daleko zostanie rozwinięty, zawsze będzie potrzeba przekonwertowania czegoś. –
Jeśli nie lubisz ograniczeń list właściwości (które nie obsługują NSNull, jak wskazuje dokumentacja), nie używaj list właściwości. Jak sugeruje inny komentator, użyj własnego formatu serializacji. Wsparcie dla NSPropertyList! = Serializacja. – AlBlue
Zamiast korzystać z listy właściwości, należy rozważyć użycie NSKeyedArchiver i NSKeyedUnarchiver. Listy właściwości mają ustalony zestaw typów, który nie obejmuje NSNull i nie ma być rozszerzony.
Oto linki do odpowiedniej dokumentacji: NSCoding, NSKeyedArchiver i NSKeyedUnarchiver.
Konwertuję NSArray lub NSDictionary na NSData przed serializacją. Poniżej znajduje się kategoria nsarray do serializacji i deserializacji. Ten comfortableby obsługuje niektóre dane są 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];
}
Bardzo dobrze! Zadziwiające jest to, że to działa (które właśnie zweryfikowaliśmy), gdy bardziej popularne metody w archiwizowanych archiwach nie działają. –
- 1. Plist zawiera znak "&"
- 2. Jak serializować obiekt, który zawiera BufferedImages
- 3. Jak utworzyć strukturę, która zawiera własną listę?
- 4. Jak sprawdzić, która linia pliku plist jest niepoprawna
- 5. SonarQube haczyk 22 z serializować list
- 6. Przetestuj funkcję, która zawiera setTimeout()
- 7. Debugowanie usługi WCF, która nie będzie serializować obiektów
- 8. Jak przekonwertować NSNull na zero w Swift?
- 9. Identyfikacja, która biblioteka systemowa Linux zawiera funkcję
- 10. Znajdź element przez XPath, która zawiera tekst
- 11. Konstrukcja DOJO, która nie zawiera podstawy DOJO
- 12. Utwórz tabelę przestawną, która zawiera listę wartości
- 13. Jak serializować typ mpf GMP?
- 14. Jak mogę usunąć plist programowo?
- 15. Jak zapisać dane w plist?
- 16. Jak serializować obiekt na XDocument?
- 17. Jak dołączyć nowy element do pliku plist?
- 18. Jak serializować lambda?
- 19. Jak serializować obiekty Ember?
- 20. Jak serializować/deserializować hashmap?
- 21. Jak odczytać tablicę z iOS plist
- 22. Jak zaokrąglić data.frame w R, która zawiera niektóre zmienne znakowe?
- 23. Jak utworzyć tablicę złożoną, która zawiera maksymalną długość?
- 24. Jak kontrolować szerokość komórki nagłówka tabeli, która zawiera obrócony tekst?
- 25. Jak zbudować łącza numeru telefonu na Androida, która zawiera rozszerzenie
- 26. Jak napisać test RSpec dla metody Ruby, która zawiera "gets.chomp"?
- 27. Jak używać Eval() z nazwą kolumny, która zawiera kropkę (.)?
- 28. Jak napisać niestandardową taghelper ASP.NET 5, która zawiera inne taghelpers
- 29. Jak określić wartość zmiennej środowiskowej Jenkins, która zawiera spację
- 30. Jak uzyskać zawartość div, która zawiera bloki skryptów JavaScript?
Odpowiedź udzielana przez Saurabh Wadhwa działa tak świetnie, po prostu używał go sam, szkoda, że nie jest oryginalny plakat wokół to zaakceptować ... –