在Swift中将结构体序列化为NSData

4
我需要将一个Swift结构体保存到NSData中。我不能符合NSCoding,因为它仅适用于NSObject的子类。 我在Swift 2.0中编写了一个小型的带有扩展的protocol,在Playground中似乎可以工作。这似乎太容易了。 这里是否有我忽略的东西? 以下代码可在Xcode 7 Beta 5的Playground中运行。
//: Playground - noun: a place where people can play

 import UIKit


protocol Serializable {
    init?(encodedData: NSData)
    var encodedData: NSData { get }
}

extension Serializable {

    var encodedData: NSData {
        var pointer = self
        return NSData(bytes: &pointer, length: sizeof(Self.self))
    }

    init?(encodedData data: NSData) {
        guard
            data.length == sizeof(Self.self)
            else { return nil }

        self = UnsafePointer(data.bytes).memory
    }
}

struct Test: CustomStringConvertible, Serializable {
    let message: String
    let people: [String]
    let color: UIColor

    var description: String {
        return "\(message) + \(people) + \(color)"
    }
}

let structToEncode = Test(message: "Hi!", people: ["me", "someone else"], color: UIColor(red: 0.5, green: 0.2, blue: 0.1, alpha: 0.4))
let encodedData = structToEncode.encodedData
let decodedStruct = Test(encodedData: encodedData)

2
我有一种感觉,如果你将数据写入文件,重新启动应用程序并尝试读取文件,这将不起作用,因为我认为你只是存储了指向内存的引用,而不是内存本身。我目前正在寻找解决方案。 - jp.rider63
3个回答

1
我也在寻找一种适用于Swift的序列化解决方案。与其发明自己的协议,不如看看 RawRepresentable。与你目前所做的相比,它更加通用,因为它没有与NSData绑定。只要你的类型在RawValue类型别名中指定了,你就可以将其序列化到任何东西上。

0

另一种解决方案是将您的数据序列化为JSON。我刚刚创建了一个pod,使这更加简单,并且它应该适用于结构体、枚举和类。要使用它,您需要实现ToJSONFromJSON协议。然后,要序列化和反序列化数据,您可以使用Aeson.encodeAeson.decode函数。


0
我编写了一个框架,可以在Swift中序列化结构体、类和枚举,尽管它仅序列化为plist文件(仅供方便,可以是任何格式)。
高级注释:
- 通过提供通过协议扩展提供'toDictionary()'方法将序列化到中间字符串:AnyObject表示。您无需支持此方面的任何操作。 - 通过泛型进行反序列化,每种类型都应具有init,该init(基本上)提供有关其属性的类型信息。
这里是关于框架的描述,以及GitHub存储库链接

这个回答在理论上可能会解决问题,但最好在此处包含答案的基本部分以供未来用户参考,并提供链接作为参考。链接为主导的答案可能会因为链接腐烂而失效。 - Mogsdad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接