有没有办法对闭包进行编码和解码?
Is there a way to encode and decode the closures?
出于某种原因,我需要序列化一个包含多个闭包字段的 class 对象。
像这样:
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
有什么办法可以得到我想要的吗?
闭包不可编码或解码,因为它们是编译到程序中的块代码。除了他们可能需要动态捕获部分程序状态这一事实(这导致使这项工作成为一项艰巨的技术挑战)之外,请考虑允许您任意编码和解码部分可执行部分的安全隐患程序:当您尝试将编码的 class 重新加载回您的应用程序并 运行 时会发生什么?如果有人恶意编辑存档以将代码插入您的程序怎么办?没有合理的方法来判断闭包是否是 valid/safe 到 运行,过去将它加载回您的进程。
这将是非常不安全的,通常甚至是系统不允许的。 (也许看看可写内存和可执行内存——出于这个安全原因,许多操作系统将内存块指定为 或者 可执行 [例如程序中的代码] 或者 可写 [例如,您读入 memory/manipulate] 的数据,但不是两者。)
出于某种原因,我需要序列化一个包含多个闭包字段的 class 对象。
像这样:
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
有什么办法可以得到我想要的吗?
闭包不可编码或解码,因为它们是编译到程序中的块代码。除了他们可能需要动态捕获部分程序状态这一事实(这导致使这项工作成为一项艰巨的技术挑战)之外,请考虑允许您任意编码和解码部分可执行部分的安全隐患程序:当您尝试将编码的 class 重新加载回您的应用程序并 运行 时会发生什么?如果有人恶意编辑存档以将代码插入您的程序怎么办?没有合理的方法来判断闭包是否是 valid/safe 到 运行,过去将它加载回您的进程。
这将是非常不安全的,通常甚至是系统不允许的。 (也许看看可写内存和可执行内存——出于这个安全原因,许多操作系统将内存块指定为 或者 可执行 [例如程序中的代码] 或者 可写 [例如,您读入 memory/manipulate] 的数据,但不是两者。)