자바스크립트 unserialize 함수
컨텐츠 정보
- 20,275 조회
- 5 추천
- 목록
본문
j님이 예전에 올렸던 팁이 unserialize 라고 생각했는데 지금 보니까 그것도 serialize 였더군요. ㅡ.ㅡ; 거친마루님의 말도 있고 해서 내친김에 unserialize 도 만들어 봤습니다.
PHP에서도 클래스는 serialize 할 때 변수만 포함하더군요. 파싱하는 형태는 배열형, 객체형, 문자형, 정수형, 실수형, 널(null) 입니다.
사용예1)
원래 형태 :
class obj
{
var $var1 = 2;
function obj() { echo 1; }
function func2() { echo 2; }
}
$obj = new obj();
serialize($obj);
실행 : obj = unserialize('O:3:"obj":1:{s:4:"var1";i:2;}');
결과 : obj.var1 == 2
사용예2)
원래형태 :
$str = 'abcdefg';
serialize($str);
실행 : str = unserialize('s:7:"abcdefg";');
결과 : str == 'abcdefg';
사용예3)
원래형태 :
$arr = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
serialize($arr);
실행 : arr = unserialize('a:11:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;}');
결과 : arr[0] = 0 ... arr[10] == 10;
소스)
function unserialize (str) {
var retVal, Len, Key, Val;
switch(str.substring(0, 1)) {
case 'N':
unserialize.str = str.substring(2);
return null;
break;
case 'd':
retVal = parseFloat(str.substring(2, str.indexOf(';')));
unserialize.str = str.substring(str.indexOf(';')+1);
break;
case 'i':
retVal = parseInt(str.substring(2, str.indexOf(';')));
unserialize.str = str.substring(str.indexOf(';')+1);
break;
case 's':
Len = parseInt(str.substring(2, str.indexOf(':', 2)));
retVal = str.substr(4 + Len.toString().length, Len);
unserialize.str = str.substring(Len.toString().length + Len + 6);
break;
case 'a':
retVal = new Array;
str = str.substring(str.indexOf('{', 3) + 1);
while (str.substring(0, 1) != '}') {
Key = unserialize(str); str = unserialize.str;
Val = unserialize(str); str = unserialize.str;
retVal[Key] = Val;
}
unserialize.str = str.substring(1);
break;
case 'O':
retVal = new Object;
str = str.substring(str.indexOf('{', 3) + 1);
while (str.substring(0, 1) != '}') {
Key = unserialize(str); str = unserialize.str;
Val = unserialize(str); str = unserialize.str;
eval("retVal." + Key + " = Val;");
}
unserialize.str = str.substring(1);
break;
}
return retVal;
}
PHP에서도 클래스는 serialize 할 때 변수만 포함하더군요. 파싱하는 형태는 배열형, 객체형, 문자형, 정수형, 실수형, 널(null) 입니다.
사용예1)
원래 형태 :
class obj
{
var $var1 = 2;
function obj() { echo 1; }
function func2() { echo 2; }
}
$obj = new obj();
serialize($obj);
실행 : obj = unserialize('O:3:"obj":1:{s:4:"var1";i:2;}');
결과 : obj.var1 == 2
사용예2)
원래형태 :
$str = 'abcdefg';
serialize($str);
실행 : str = unserialize('s:7:"abcdefg";');
결과 : str == 'abcdefg';
사용예3)
원래형태 :
$arr = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
serialize($arr);
실행 : arr = unserialize('a:11:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;}');
결과 : arr[0] = 0 ... arr[10] == 10;
소스)
function unserialize (str) {
var retVal, Len, Key, Val;
switch(str.substring(0, 1)) {
case 'N':
unserialize.str = str.substring(2);
return null;
break;
case 'd':
retVal = parseFloat(str.substring(2, str.indexOf(';')));
unserialize.str = str.substring(str.indexOf(';')+1);
break;
case 'i':
retVal = parseInt(str.substring(2, str.indexOf(';')));
unserialize.str = str.substring(str.indexOf(';')+1);
break;
case 's':
Len = parseInt(str.substring(2, str.indexOf(':', 2)));
retVal = str.substr(4 + Len.toString().length, Len);
unserialize.str = str.substring(Len.toString().length + Len + 6);
break;
case 'a':
retVal = new Array;
str = str.substring(str.indexOf('{', 3) + 1);
while (str.substring(0, 1) != '}') {
Key = unserialize(str); str = unserialize.str;
Val = unserialize(str); str = unserialize.str;
retVal[Key] = Val;
}
unserialize.str = str.substring(1);
break;
case 'O':
retVal = new Object;
str = str.substring(str.indexOf('{', 3) + 1);
while (str.substring(0, 1) != '}') {
Key = unserialize(str); str = unserialize.str;
Val = unserialize(str); str = unserialize.str;
eval("retVal." + Key + " = Val;");
}
unserialize.str = str.substring(1);
break;
}
return retVal;
}
관련자료
-
링크
댓글 0
등록된 댓글이 없습니다.