Как преобразовать NSArray в NSData?

82

Может ли кто-нибудь сказать мне, как преобразовать NSArrayв NSData? У меня есть NSArray. Мне нужно отправить его по адресу NSInputStream. Для этого мне нужно преобразовать файл в NSArrayфайл NSData.

Пожалуйста, помогите мне, я застрял здесь.

сатиш
источник

Ответы:

190

Используйте NSKeyedArchiver (последнее предложение ссылок на пост Гаррета):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Обратите внимание, что все объекты arrayдолжны соответствовать NSCodingпротоколу. Если это настраиваемые объекты, это означает, что вам нужно прочитать об объектах кодирования и декодирования .

Обратите внимание, что это создаст довольно трудный для чтения формат списка свойств, но может обрабатывать очень широкий спектр объектов. Если у вас очень простой массив (например, строки), вы можете использовать NSPropertyListSerialization, который создает немного более простой список свойств:

NSString *error;
NSData *data = [NSPropertyListSerialization dataFromPropertyList:array format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];

Также существует константа формата XML, которую вы можете передать, если хотите, чтобы ее можно было читать по сети.

Роб Напье
источник
93

В некотором роде примечание, вот как вы бы преобразовали NSData обратно в NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Майкл Тиль
источник
5
Убедитесь, что это NSKeyedUnarchiver, а не NSKeyedArchiver. При использовании автозаполнения легко сделать ошибку.
Шон
2
Этот ответ в сочетании с выбранным выше ответом должен быть достаточным для архивации / разархивирования любого совместимого объекта в / из NSData
Скотт Д.
3

Я не уверен, что это поможет вам, но это ссылка для NSMutableArray на NSData .

Гарретт
источник
Спасибо за быстрый ответ, я проверил, что раньше это не помогло.
суббота
3

Я использовал этот код.

 NSError *error;
 NSMutableData *jsonData = [[NSJSONSerialization dataWithJSONObject:yourDemoArray
                                                                   options:0 // Pass 0 if you don't care about the readability of the generated string
                                                                     error:&error] copy];
Авиджит Нагаре
источник
1

Ты можешь это сделать-

NSArray *array= [NSArray array];
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array];
Нитеш
источник
1

В iOS 9+ используйте это, пожалуйста:

NSArray *array = [[NSArray alloc] init];
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];

Более старая версия этого была объявлена ​​устаревшей в iOS 8.

НилНи
источник
1

Swift:

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
ioopl
источник