NSKeyedUnarchiver 为其他人创建相同对象引用的多个实例

问题描述

我正在尝试使用 NSKeyedArchiver,因为我正在考虑保存对象图。但是,对象引用另一个对象的同一实例似乎存在问题。比如说,我有三个类:ABC,它们像这样相互引用:

A --> B <-- C

AC 每个都有对同一个对象 B 的引用。使用 NSKeyedUnarchiver 解码时,它只是创建 B 的多个实例,以便 AB 不再引用同一个对象。

这是一个完整的例子:

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 (将#修改为@)