package com.utils { public class Serializer extends Object { public static var c:uint; public static var pattern:RegExp = /[A-Z][a-z]{2}, \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2} \+|\-\d{4}/g public static function serialize(data:*):String { var s:String; var tmp:Array = new Array(); var i:int = 0; var key:String; if(data is Boolean){ s = "b:"+uint(data)+";"; } else if(data is int){ s = "i:"+data.toString()+";"; } else if(data is Number){ s = "d:"+data.toString()+";"; } else if(data is String){ s = "s:"+Serializer.stringLength(data)+":\""+data+"\";" } else if(data is Date){ s = "s:" + data.toString().length + ":\"" + data + "\";" } else if(data is Object){ for(key in data){ tmp.push(Serializer.serialize(key)); tmp.push(Serializer.serialize(data[key])); i += 1; } s = "O:8:\"stdClass\":" + i + ":{" + tmp.join("") + "}"; } else if(data is Array){ for(key in data){ tmp.push(Serializer.serialize(i)) tmp.push(Serializer.serialize(data[key])) i += 1 } s = "a:"+i+":{"+ tmp.join("") + "}"; } else if(data == null || data == undefined){ s = "N;"; } else { s = "i:0;" } return s; } public static function unserialize(data:String):* { Serializer.c = 0; return Serializer.unserialize_internal(data); } public static function unserialize_internal(data:String):* { var result:*; var tmpvar:*; var tmp:Array = new Array(); var type:String = data.charAt(Serializer.c); var pos:uint = 0; var islist:Boolean = true; var i:uint; switch(type){ case "N": Serializer.c += 2; break; case "b": result = data.substr(Serializer.c+2, 1) == "1" Serializer.c += 4 break; case "i": tmp.push(data.indexOf(";", Serializer.c)) pos = Serializer.c+2 Serializer.c = tmp[0]+1 result = int(data.substring(pos,tmp[0])) break; case "d": tmp.push(data.indexOf(";", Serializer.c)) pos = Serializer.c + 2 Serializer.c = tmp[0]+1 result = Number(data.substring(pos,tmp[0])) break; case "s": tmp.push(int(data.indexOf(":", Serializer.c+2))) tmp.push(tmp[0]+2) pos = Serializer.c+2 tmp.push(0) tmp.push(int(data.substring(pos, tmp[0]))) if(tmp[3] == 0) { result = ""; Serializer.c = pos+5 } else { var lenc:uint = Serializer.stringCLenght(data, Serializer.c, tmp[3]); if(lenc != tmp[3]) { result = data.substr(tmp[0]+2, lenc); Serializer.c = tmp[0]+4+lenc; } else { result = data.substr(tmp[0]+2, tmp[3]); Serializer.c = tmp[0]+4+tmp[3]; } } if(Serializer.pattern.test(result)) { result = new Date(result) } break; case "a": pos = Serializer.c+2 tmp.push(int(data.indexOf(":", pos))) tmp.push(int(data.substring(pos, tmp[0]))) Serializer.c = tmp[0]+2 result = [] for(i = 0; i < tmp[1]; i++){ tmpvar = Serializer.unserialize_internal(data) result[tmpvar] = Serializer.unserialize_internal(data); if(!(tmpvar is int) || tmpvar < 0){ islist = false } } if(islist){ tmp.push([]) for(var key:uint = 0; key < result.length; key++){ pos = tmp[2].length while(key > pos){ tmp[2].push(null) pos +=1 } tmp[2].push(result[key]) } result = tmp[2] } Serializer.c += 1 break; case "O": pos = data.indexOf("\"", Serializer.c)+1; Serializer.c = data.indexOf("\"", pos); tmp.push(data.substring(pos, Serializer.c)) Serializer.c += 2 i = Serializer.c Serializer.c = data.indexOf(":", i) i = int(data.substring(i, Serializer.c)) Serializer.c +=2; result = {}; var tmps:*; while(i > 0){ tmps = Serializer.unserialize_internal(data) result[tmps] = Serializer.unserialize_internal(data) i -= 1 } break; } return result; } public static function stringCLenght(data:String, from:uint = 0, len:uint = 0):int { var i:uint; var j:uint = len; var startIndex:uint = from + 4 + len.toString().length; for (i = 0; i < j; i++){ if (data.charCodeAt(i+startIndex) > 128) { j = j - 1 } } return j; } public static function stringLength(data:String):uint { var code:int = 0 var result:int = 0 var slen:int = data.length; while(slen){ slen = slen - 1 try { code = data.charCodeAt(slen) } catch(e:Error){ code = 65536 } if(code < 128){ result = result + 1 } else if(code < 2048){ result = result + 2 } else if(code < 65536){ result = result + 3 } else { result = result + 4 } } return result } } }