         }
         return Serialized.Str("")
     }
-}+}
+
+public protocol SerializableObject: NSObjectProtocol, AutoSerializable {
+    static var serializableKeys:[String] { get }
+    
+    func valueForKey(key:String) -> AnyObject
+    func setValue(value: AnyObject?, forKey key: String)
+}
+
+public extension SerializableObject {
+    public func ss_serialize() -> Serialized {
+        var dict = [String:Serialized]()
+        
+        for key in self.dynamicType.serializableKeys {
+            dict[key] = (self.valueForKey(key) as? Serializable)?.ss_serialize()
+        }
+        return Serialized.CustomType(typeName: self.dynamicType.ss_typeName, data: Serialized.Dict(dict))
+    }
+}

    }
    
    private enum Case:String {
        case Struct = "struct"
        case Dict = "dict"
        case Array = "array"
        case Str = "string"


    private class func unwrapCase(type:Serialized.Case, value:AnyObject) -> Serialized {
        switch type {
        case .CustomType:
            return Unwrapper.unwrapCustomType(value as! NSDictionary)
        default:
            return Unwrapper.unwrap(value)
        }
