Лучший способ записать произвольные NSData в NSXMLElement

Я разрешаю экспортировать данные приложения (это приложение Mac на 10.7) в виде файла XML, и одно поле, которое я хотел бы иметь возможность экспортировать / импортировать в / из XML, - это NSData поле. Каков будет правильный / принятый способ сделать это? Должен ли я преобразовать в base64 и записать эту строку в XML?

Я бы предпочел не выдвигать свое собственное решение, используя категорию, как это делает принятый ответ на связанный вопрос (ссылка на решение Мэтта Галлахера).

Обновить

Я только что обнаружил NSPropertyListSerialization учебный класс. Я возродил свои надежды, но он имеет только статические методы сериализации, которые возвращают NSData представления.

1 ответ

Решение

Я понял (как упоминалось в моем обновленном), что могу использовать класс NSPropertyListSerialization, так как NSData вернулся -dataWithPropertyList:format:options:error: это просто строка UTF-8. Вот что я использую для сериализации:

NSData *data = value;

NSError *error = nil;
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:data
                                                               format:NSPropertyListXMLFormat_v1_0
                                                              options:0
                                                                error:&error];
if (error) {
    NSLog(@"Error serializing data to plist XML: %@", error);
} else {
    NSString *plistString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding];
    NSXMLElement *dataElement = [NSXMLElement elementWithName:field
                                                  stringValue:plistString];
}

И десериализовать

NSData *plistData = [element.stringValue dataUsingEncoding:NSUTF8StringEncoding];
NSData *originalData = [NSPropertyListSerialization propertyListWithData:plistData
                                                                 options:NSPropertyListImmutable
                                                                  format:NULL
                                                                   error:&error];

if (error) {
    NSLog(@"Error deserializing data from plist XML: %@", error);
} else {
    value = originalData;
}
Другие вопросы по тегам