【发布时间】:2021-06-04 21:34:57
【问题描述】:
以下情况: 我使用了几种使用数据结构的设备。如果我现在为较新版本扩展结构的键,则新结构被编码然后同步。作为同步的结果,旧数据结构用于解码。当您随后与新设备同步时,新密钥已丢失。我怎样才能防止这种情况发生?
使用游乐场
import Foundation
struct OLD_API: Codable {
var text: String
}
struct NEW_API: Codable {
var text: String
let value: Int
}
// Init data on device with NEW data struct
var newDevice = NEW_API(text: "Dog", value: 200)
let data = try! JSONEncoder().encode(newDevice)
// .. sync to other devices (new to old)
// modified data on device with OLD data struct
var oldDevice = try! JSONDecoder().decode(OLD_API.self, from: data)
oldDevice.text = "Cat"
let newData = try! JSONEncoder().encode(oldDevice)
// .. sync to other devices (old to new)
// decode data on device with NEW data struct
newDevice = try! JSONDecoder().decode(NEW_API.self, from: newData)
print(newDevice)
【问题讨论】:
-
这是一个很好的问题 -- 但是,请发布代码,而不是代码图片,这些图片不可搜索、不可复制/粘贴,并且不适用于移动设备或屏幕阅读器。
-
当然会丢失,因为旧 API 不知道新密钥。您可以将新键声明为可选。我完全同意 jnpdx。
-
@jnpdx 代码已添加。
-
不幸的是,可选键不是解决方案。我想避免丢失信息。 @vadian
-
如果您使用旧 API 对数据进行编码,那么这是不可能的,旧 API 只是删除了 new 键。
标签: swift encoding decode encode decoding