Хранение и чтение NSKeyedArchived NSData в / из базы данных
У меня есть объект, который содержит большое количество переменных, которые необходимо сохранить локально, а также в базе данных. Этот объект будет сериализован и сохранен локально с использованием NSKeyedArchiver (совместно с CryptoCoder из https://github.com/nicklockwood/CryptoCoding).
Сейчас я пытаюсь сохранить данные в БД (cloudant.com). Я могу отправить данные, используя NSData напрямую, сохраняя (например,
Поскольку сериализованные данные записываются в файл, который соответствует формату 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, в зависимости от вашей реализации.
По сути, измените ваши шаги сериализации.