Я пытаюсь реорганизовать некоторые функции кэширования, которые были реализованы с 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
из старой реализации, в то же время гарантируя, что старые заархивированные объекты также могут быть десериализованы должным образом?