Перенос NSKeyedArchiver и UnArchiver в FileManager - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь реорганизовать некоторые функции кэширования, которые были реализованы с NSKeyedArchiver и NSKeyedUnarchiver, с использованием некоторых устаревших методов, таких как: NSKeyedUnarchiver.unarchiveObject(withFile:) Я думал о замене этой функции, используя вместо этого FileManager.

Изменения, которые я внедрил, будут работать нормально для чистой установки приложения, но не будут работать нормально, если приложение обновлено, и некоторые кэшированные данные необходимы сразу после запуска приложения после обновления, то есть; файл, кэшированный с помощью NSKeyedArchiver, не может быть сериализован как json объект.

Старая реализация сохранения объекта как Any:

let fileAddress = "test/address"
let object: Any! // it is usually in the format of [String: Any]

guard NSKeyedArchiver.archiveRootObject(object, toFile: fileAddress) else {
  print("archiving failed.")
  return
}

Следующая старая реализация получения такого файла с NSKeyedUnarchiver следующая , которая отлично работает:

let fileAddress = "test/address"

guard let object = NSKeyedUnarchiver.unarchiveObject(withFile: fileAddress) else {
  print("No object found in given file address.")
  return
}

Моя новая попытка получить этот объект с помощью FileManager и преобразовать его в json из данных:

let fileAddress = "test/address"

do {
  if FileManager.default.fileExists(atPath: fileAddress) {
      if let data = FileManager.default.contents(atPath: fileAddress) {
          let object = try JSONSerialization.jsonObject(with: data) // crash occurs while trying to serialize.
      }
  }
} catch let error {
    print(error.localizedDescription)
}

Приложение падает на return try JSONSerialization.jsonObject(with: data) со следующей ошибкой:

Данные не могут быть прочитаны, потому что они не в правильном формате.

Я знаю, что ошибка говорит сама за себя, но я просто делаю Не понимаете, почему объект типа Any, который был ранее заархивирован, не может быть сериализован из data

Есть ли какие-либо идеи по переходу на FileManager из старой реализации, в то же время гарантируя, что старые заархивированные объекты также могут быть десериализованы должным образом?

...