swift 对象序列化

最近用swift做一个新项目,在项目中需要用到序列化保存一点配置信息,用来在登录前进行使用。也就想到使用序列化保存这些数据:

  • 首先创建一个类,继承于NSCoding
  • 实现NSCoding的两个protocol方法
func encode(with aCoder: NSCoder) {
}

required init?(coder aDecoder: NSCoder) {
}
  • 在类中声明需要保存的属性
  • 进行序列化和反序列化

具体代码如下:

class YFConfigManage:NSObject, NSCoding {
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(apiUrl, forKey: "apiUrl")
        aCoder.encode(downloadUrl, forKey: "downloadUrl")
        aCoder.encode(uploadUrl, forKey: "uploadUrl")
    }
    
    required init?(coder aDecoder: NSCoder) {
        apiUrl = aDecoder.decodeObject(forKey: "apiUrl") as! String
        downloadUrl = aDecoder.decodeObject(forKey: "downloadUrl") as! String
        uploadUrl = aDecoder.decodeObject(forKey: "uploadUrl") as! String
        super.init()
    }
    
    
    var apiUrl: String
    var downloadUrl: String
    var uploadUrl: String
    
    override init() {
        
        // 反序列化
        let def = UserDefaults.standard
        if let data = def.object(forKey: "YFConfigData") {
            if let configData = NSKeyedUnarchiver.unarchiveObject(with: data as! Data) as? YFConfigManage {
                apiUrl = configData.apiUrl
                downloadUrl = configData.downloadUrl
                uploadUrl = configData.apiUrl
            }
        }
        super.init()
    }
    
    func configWithResponse(responseDic: Dictionary<String, Any>) -> Void {
        self.apiUrl = responseDic["apiUrl"] as! String
        self.downloadUrl = responseDic["downloadUrl"] as! String
        self.uploadUrl = responseDic["uploadUrl"] as! String
        
        // 序列化
        let data = NSKeyedArchiver.archivedData(withRootObject: self)
        // 存储到本地文件
        let def = UserDefaults.standard
        def.set(data, forKey: "YFConfigData")
        def.synchronize()
        
    }
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容