有没有办法对闭包进行编码和解码?

时间:2017-06-25 02:19:30

标签: swift serialization decode encode nscoder

出于某种原因,我需要序列化一个包含几个闭包字段的类对象。

像这样:

import Foundation

class Foo: NSObject, NSCoding {

    var bar: (() -> Void)

    override init() {
        bar = {}
    }

    required init(coder aDecoder: NSCoder) {
        bar = aDecoder.decodeObject(forKey: "bar") as! (() -> Void)
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(bar, forKey: "bar")
    }

}

let foo = Foo()
foo.bar = {
    print("Help!")
}

let data = NSKeyedArchiver.archivedData(withRootObject: foo)
let object = NSKeyedUnarchiver.unarchiveObject(with: data) as! Foo

有什么方法可以得到我想要的东西吗?

1 个答案:

答案 0 :(得分:4)

闭包不可编码或可解码,因为它们是编译到程序中的块代码。除了他们可能需要动态捕获程序状态的部分(这导致使这项工作难以进行技术挑战)的事实,考虑允许您任意编码和解码部分可执行部分的安全隐患程序:当您尝试将编码类重新加载到应用程序并运行它时会发生什么?如果某人恶意编辑了存档以将代码插入您的程序,该怎么办?没有合理的方法来确定关闭是否有效/安全运行,过去将其加载回您的过程。

这将是非常不安全的,并且通常甚至不被系统允许。 (也许考虑可写与可执行内存 - 出于这个安全原因,许多操作系统指定内存块为 可执行[例如程序中的代码] 可写[例如,您读入内存/操作的数据],但不是两者。)