问题描述
我正在尝试使用 NSKeyedArchiver
,因为我正在考虑保存对象图。但是,对象引用另一个对象的同一实例似乎存在问题。比如说,我有三个类:A
、B
和 C
,它们像这样相互引用:
A --> B <-- C
A
和 C
每个都有对同一个对象 B
的引用。使用 NSKeyedUnarchiver
解码时,它只是创建 B
的多个实例,以便 A
和 B
不再引用同一个对象。
这是一个完整的例子:
import Foundation
class A: Codable {
var b: B
init(b: B) {
self.b = b
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.b = try container.decode(B.self,forKey: .b)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(b,forKey: .b)
}
private enum CodingKeys: String,CodingKey {
case b
}
}
class B: Codable {
init() {}
required init(from decoder: Decoder) throws {}
func encode(to encoder: Encoder) throws {}
}
class C: Codable {
var b: B
init(b: B) {
self.b = b
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.b = try container.decode(B.self,CodingKey {
case b
}
}
class Store: Codable {
var a: A
var b: B
var c: C
init() {
b = B()
a = A(b: b)
c = C(b: b)
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.a = try container.decode(A.self,forKey: .a)
self.b = try container.decode(B.self,forKey: .b)
self.c = try container.decode(C.self,forKey: .c)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(a,forKey: .a)
try container.encode(b,forKey: .b)
try container.encode(c,forKey: .c)
}
private enum CodingKeys: String,CodingKey {
case a,b,c
}
}
let store = Store()
let archiver = NSKeyedArchiver(requiringSecureCoding: false)
try! archiver.encodeencodable(store,forKey: NSKeyedArchiveRootObjectKey)
archiver.finishEncoding()
let unarchiver = try! NSKeyedUnarchiver(forReadingFrom: archiver.encodedData)
if let decodedStore = try! unarchiver.decodetopLevelDecodable(Store.self,forKey: NSKeyedArchiveRootObjectKey) {
// Will print false
print(decodedStore.a.b === decodedStore.c.b)
}
我是做错了什么还是做这样的事情根本不起作用?还是我的例子有缺陷?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)