NSKeyedArchiver пишут XML (или другое человекочитаемое)?

Можно попробовать схему клавиатуры Emacs ( Инструменты-> Опции-> Среда-> Клавиатура )

8
задан fuzzygoat 30 October 2009 в 19:07
поделиться

4 ответа

Это то, что вы должны сделать:

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver setOutputFormat:NSPropertyListXMLFormat_v1_0];
[archiver encodeObject:artistCollection forKey:@"root"];
[archiver finishEncoding];
[data writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];
[archiver release];

Обратите внимание, что вы должны использовать [архиватор encodeObject: artistCollection forKey: @ "root"] вместо [архиватор encodeRootObject: artistCollection]; как предлагает Шон. Это потому, что NSKeyedArchiver не отменяет NSCoder: метод encodeRootOot сочтем это ошибкой и сообщим об этом в Apple.

Теперь, реальный вопрос: почему вы хотите писать XML вместо двоичного формата по умолчанию? Если это для целей отладки, я предлагаю вам использовать TextWrangler , который позволит вам прозрачно редактировать двоичные файлы plist, как если бы они были XML.

17
ответ дан 5 December 2019 в 08:24
поделиться

Вам нужно сначала создать экземпляр NSKeyedArchiver вместо использования удобного метода класса, который вернет только NSData.

NSMutableData *data = [NSMutableData new];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

// set the one property you specifically wanted
[archiver setOutputFormat:NSPropertyListXMLFormat_v1_0];

// now encode (and finalize) the actual object - note that encodeRootObject: is inherited
// from NSCoder. I assume this works :)
[archiver encodeRootObject:artistCollection];
[archiver finishEncoding];

// now finally write it out - the resulting encoded stuff should be waiting in the data object
[data writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];

// cleanup after ourselves
[archiver release];
[data release];

Отказ от ответственности. : Я написал этот код в поле ввода здесь и на самом деле не тестировал его.

2
ответ дан 5 December 2019 в 08:24
поделиться

«archivedDataWithRootObject:» - это метод класса, а «setOutputFormat» - метод экземпляра. Из документации для 'archivedDataWithRootObject:':

Объект NSData, содержащий закодированную форму графа объектов, корневым объектом которого является rootObject. Формат архива - NSPropertyListBinaryFormat_v1_0.

Что вам нужно сделать, так это создать NSKeyedArchiver и закодировать корневой объект. Также убедитесь, что все содержимое вашей коллекции реализует encodeWithCoder и initWithCoder. Видеть Кодирование и декодирование объектов

Проблема с этим подходом состоит в том, что вам нужно вручную назначать ключи для каждого кодируемого объекта, что не похоже на то, что вы хотите, поскольку у вас уже есть коллекция. И массивы, и словари содержат методы для записи в XML-файл, что является гораздо более простым подходом.

[artistCollection writeToFile:@"/Users/fgx/Desktop/stuff" atomically:YES];

Обсуждение этого метода (как для NSDictionary, так и для NSArray):

Если все содержимое получателя является объектами списка свойств (NSString, NSData, NSArray или NSDictionary), файл, написанный этим методом, можно использовать для инициализации нового массива с помощью метода класса arrayWithContentsOfFile: или метода экземпляра initWithContentsOfFile :. Этот метод рекурсивно проверяет, что все содержащиеся объекты являются объектами списка свойств, перед записью файла и возвращает NO, если все объекты не являются объектами списка свойств, Blockquote

1
ответ дан 5 December 2019 в 08:24
поделиться
[artistData setOutputFormat: NSPropertyListXMLFormat_v1_0];
0
ответ дан 5 December 2019 в 08:24
поделиться