Хранение и чтение NSKeyedArchived NSData в / из базы данных

У меня есть объект, который содержит большое количество переменных, которые необходимо сохранить локально, а также в базе данных. Этот объект будет сериализован и сохранен локально с использованием NSKeyedArchiver (совместно с CryptoCoder из https://github.com/nicklockwood/CryptoCoding).

Сейчас я пытаюсь сохранить данные в БД (cloudant.com). Я могу отправить данные, используя NSData напрямую, сохраняя (например, ) в базе данных, но читая это обратно, я понятия не имею, как преобразовать их обратно в NSData. Использование NSString с кодировкой приводит к нулевому результату.

Поскольку сериализованные данные записываются в файл, который соответствует формату plist, я попытался преобразовать их в NSDictionary с помощью NSPropertyListSerialization и вместо этого отправить их, но преобразование было неточным.

Нужен совет.

1 ответ

Решение

NSData (например, ) в шестнадцатеричном формате. Я полагаю, что вы звоните [NSData description] метод, чтобы получить этот результат. Не предполагается использовать для сериализации, хотя сериализация не является невозможной. (Просто нужно написать собственный шестнадцатеричный преобразователь данных)

Существует много способов передачи данных по сети. Я предполагаю, что вы используете HTTP для вашего транспортного уровня. Я перечисляю 2 способа сделать это

Способ JSON (также работает для plist, хотя он поддерживает больше типов данных)

Напишите пользовательский сериализатор и десериализатор, которые преобразуют объект для сериализации в объект, который NSJSONSerializer может успешно сериализовать в JSON.

Объект, который может быть преобразован в JSON, должен иметь следующие свойства:

  • Объект верхнего уровня - это NSArray или NSDictionary.
  • Все объекты являются экземплярами NSString, NSNumber, NSArray, NSDictionary или NSNull.
  • Все ключи словаря являются экземплярами NSString.
  • Числа не NaN или бесконечность.

Ссылка:

Необработанные NSData через HTTP

Загрузка необработанных NSData (из NSCoding) через HTTP обычно выполняется с помощью HTTP POST для application/octet-stream или multipart/form-data.

Если вы хотите выполнить POST с другим методом, таким как application/x-www-form-urlencoded, вам нужно сериализовать его для веб-кодирования, такого как base64 или шестнадцатеричный. Я рекомендую использовать Base64. iOS не поставляется с кодировщиком и декодером Base64, но я написал (на основе реализации AFNetworking Мэтта Томпсона). Я знаю, что другие люди написали аналогичные методы, которые я рассмотрел, и выяснили, что Мэтт Томпсон (и впоследствии мой производный код декодера base64) чист, читаем и содержит как можно меньше логики.

Реализация кодирования и декодирования Base64 в Objective-C

Убедитесь, что при извлечении данных с вашего сервера, если они закодированы (base64 или hex), сначала выполните декодирование. Сериализуйте декодированные данные в JSON, список свойств или NSCoding, в зависимости от вашей реализации.

По сути, измените ваши шаги сериализации.

Другие вопросы по тегам