swift-serialize 1.0.0

swift-serialize 1.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新版本2015 年 11 月
SPM支持 SPM

sagesse-cn 维护。



  • 作者:
  • sagesse-cn

Serialize (swift 2.0/2.1)

  • 将 Swift 对象序列化为 JSON
  • 将 JSON 解序列化为 Swift 自定义类

Serialize 支持

AnyObject (大多数)

Deserialize 支持

类型 描述
Class 支持,自动推断类型,部分类型需要实现SerializeableCodeable
Enum 支持,需要实现SerializeableCodeable
Struct 支持,需要实现SerializeableCodeable
Tuple 不支持,无法序列化和反序列化(临时类型),无法映射(NSArray,NSDictionary)
Optional 支持,自动推断元素
Collection 支持,自动推断元素
Dictionary 支持,自动推断键值类型
Set 支持,自动推断元素(映射为数组)

特殊支持

  • [X] NSDate
  • [X] NSURL
  • [X] NSData(Base64)
  • [X] UIImage(Base64)

使用方法

  • [X] 使用源代码
  • [X] 使用框架
  • [X] 使用 Cocoapods

Cocoapods Podfile

platform :ios, '8.0'
pod "swift-serialize"
use_frameworks!
let e1 = Example()

e1.val_int = 123
e1.val_bool = true
e1.val_double = 456.0
e1.val_string = "hello swift"
e1.val_array = [7, 8, 9]
e1.val_dictionary = [10 : 11, 12 : 13, 14 : 15]

// serialize
let json = serialize(e1)
let jsonData = try! Serialize.serializeToJSONData(e1)
let jsonString = try! Serialize.serializeToJSONString(e1)

print(jsonData!.length)
print(jsonString!)

// deserialize
let e2: Example? = Serialize.deserialize(json!)
let e3: Example? = Serialize.deserialize(json!, Example.self) as? Example

print(e1 == e2)
print(e2 == e3)

如何让 struct/class 支持序列化

方法1: 使用 Codeable

Codeable 需要实现 setValue:forSerialize:valueForSerialize: 方法.

Buildable 仅在反序列化时使用,如果您不需要反序列化,可以跳过。

序列化:直接获取成员,因此没有调用 valueForSerialize:,此函数为保留函数。

反序列化:将使用 setValue:forSerialize:,需在方法中对每个成员进行更新,可以使用 assign 简化类型转换的代码。

class Example : Buildable, Codeable {
    var a: Optional<Int> = nil
    var b: Optional<String> = nil
    var c: Optional<Array<Int>> = nil

    var u1: Optional<NSURL> = nil
    var u2: Optional<NSURL> = nil

    required init() {}

    func valueForSerialize(key: String) -> Any? {
        return nil
    }

    func setValue(value: Any?, forSerialize key: String) {
        switch key {
            case "a": assign(&a, value)
            case "b": assign(&b, value)
            case "c": assign(&c, value)
            default: break
        }
    }
}

方法2: 使用 Serializeable

Serializeable 需要实现 serializedeserialize: 方法。

class Example : Serializeable {
    var a: Optional<Int> = nil
    var b: Optional<String> = nil
    var c: Optional<Array<Int>> = nil

    var u1: Optional<NSURL> = nil
    var u2: Optional<NSURL> = nil

    required init() {}

    func serialize() -> AnyObject? {
        let dic = NSMutableDictionary()
        if let o = a.serialize() {
            dic["a"] = o
        }
        if let o = b.serialize() {
            dic["b"] = o
        }
        if let o = c.serialize() {
            dic["c"] = o
        }
        return dic.count != 0 ? dic : nil
    }
    static func deserialize(o: AnyObject) -> Self? {
        // 只处理NSDictionary的
        guard let dic = o as? NSDictionary where dic.count != 0 else {
            return nil
        }
        var tmp = self.init()

        if let v = Optional<Int>.deserialize(dic["a"] ?? NSNull()) {
            tmp.a = v
        }
        if let v = Optional<String>.deserialize(dic["b"] ?? NSNull()) {
            tmp.b = v
        }
        if let v = Optional<Array<Int>>.deserialize(dic["c"] ?? NSNull()) {
            tmp.c = v
        }
        return tmp
    }
}

方法3: 继承自 NSObject

NSObject 仅使用 Serializeable,因为它已经实现了 serializedeserialize:

大部分情况下可以直接使用系统的 KVC (NSKeyValueCoding),但也有一些情况无法使用系统的 KVC。

您可以使用 @objc 来检查是否原生支持,对于那些不支持的情况,您需要实现 Codeable

class Example : NSObject, Codeable {

    // base type
    var val_int: Int = 0
    var val_bool: Bool = false
    var val_double: Double = 0
    var val_string: String?
    var val_array: [Int] = []
    var val_dictionary: [Int:Int] = [:]

    // 原生KVC不支持的类型
    var val_int_t: Int?
    var val_bool_t: Bool?
    var val_doulbe_t: Double?
    var val_array_t: [Int?]?
    var val_dictionary_t: [Int:Int?]

    // custom type
    var val_custom: Custom?
    var val_custom_array: [Custom]?
    var val_custom_dictionary: [String:Custom]?

    class Custom : NSObject {
        var val: Example?
    }
    func valueForSerialize(key: String) -> Any? {
        return nil
    }
    func setValue(value: Any?, forSerialize key: String) {
        switch key {
            case "val_int_t": assign(&val_int_t, value)
            case "val_bool_t": assign(&val_doulbe_t, value)
            case "val_array_t": assign(&val_array_t, value)
            case "val_dictionary_t": assign(&val_dictionary_t, value)
            default: break
        }
    }
}

关于系统 KVC 不支持的类型

类型 描述
enum 除了 @objc enum E : Int,其他都不支持
tuple 所有都不支持
struct 所有都不支持
class 除了继承自 NSObject 的自定义类外,都不支持
optional 大部分支持,需要使用 @objc 来检查