Как сериализовать объект в файл с помощью NSKeyedArchiver в формате NSPropertyListXMLFormat_v1_0?

Надеюсь, это название достаточно ясно. Во всяком случае, кажется:

[NSKeyedArchiver archiveRootObject:rootObject toFile:path];

ограничен NSPropertyListBinaryFormat_v1_0.

Мне нужно, чтобы формат был удобочитаемым для человека [так xml]. Если вам интересно, это часть проекта, который я в конечном итоге опубликую на github с сообщением в блоге о том, как модульно тестировать приложения GPS.

:-)


person Keith Fitzgerald    schedule 07.04.2009    source источник


Ответы (3)


Вы должны использовать NSPropertyListSerialization, чтобы преобразовать его. По сути, если предположить, что объект, который вы сериализуете, называется myObject, а окончательный файл хранится в myPath, вы должны сериализовать его в XML, используя что-то вроде следующего фрагмента кода:

NSString *error = nil;
NSData *mySerializedObject = [NSKeyedArchiver archivedDataWithRootObject:myObject];
NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:mySerializedObject
                        format:NSPropertyListXMLFormat_v1_0
                        errorDescription:&error]:
if( xmlData ) {
    [xmlData writeToFile:myPath atomically:YES];
} else {
    NSLog(error);
    [error release];
}
person Jason Coco    schedule 07.04.2009
comment
Спасибо Джейсон! Я тестирую это сейчас. - person Keith Fitzgerald; 07.04.2009

Вместо использования метода класса попробуйте создать экземпляр NSKeyedArchiver и использовать setOutputFormat:NSPropertyListXMLFormat_v1_0 для указания формата XML. Единственным недостатком является то, что потребуется несколько дополнительных строк кода, поскольку для фактической обработки сериализации он не просто возвращает объект NSData за один шаг.

person Marc Charbonneau    schedule 07.04.2009

Вам нужно будет закодировать класс объекта, используя метод -(void) encodeWithCoder(NSCoder *)encoder {

[coder encodeObject:name forKey:@"name"];
[coder encodeObject:address forKey:@"address"];
[coder encodeObject:position forKey:@"position"];

}

person Muhammad Aamir Ali    schedule 20.02.2013