자바스크립트 serialize 함수
컨텐츠 정보
- 23,826 조회
- 2 추천
- 목록
본문
*소개)
예전에 PHP -> 자바스크립트로 serialize 시켜서 통신하는 것을 보았는데, 그 반대 방향도 가능했으면 좋겟다는 생각에 만들어본 함수입니다. 솔직히 만든 저 역시 아직 사용처를 정하지 못했지만, 어딘가에는 쓸만한 곳이 있을 듯 하여 공개합니다. -_-;;
*소스)
function serialize (obj) {
var idx, len=0, retStr = '';
switch(typeof(obj)) {
case 'number':
if (parseInt(obj) == obj) retStr = 'i:' + obj + ';';
else retStr = 'd:' + obj + ';';
break;
case 'string':
retStr = 's:' + obj.length + ':"' + obj + '";'
break;
case 'null':
retStr = 'N;';
break;
case 'object':
if (obj == null) {
retStr = 'N;';
} else if (typeof(obj.reverse) == 'function') {
retStr = 'a:' + obj.length + ':{';
for (idx in obj) {
if (parseInt(idx).toString() == idx) idx = parseInt(idx);
retStr += serialize(idx) + serialize(obj[idx]);
}
retStr += '}';
} else {
for (idx in obj) {
if (parseInt(idx).toString() == idx) idx = parseInt(idx);
retStr += serialize(idx) + serialize(obj[idx]);
len++;
}
retStr = 'a:' + len + ':{' + retStr + '}';
}
break;
default:
retStr = 'N;';
}
return retStr;
}
*주의)
메소드와 프로퍼티가 공존하는 객체형은 제대로 된 결과를 얻을 수 없습니다. 자바스크립트의 객체모델과 PHP의 객체모델이 좀 달라서 이 부분은 제대로 할 수 없더군요. 숫자, 문자열, 숫자인덱스 배열, 문자열인덱스 배열(이 부분이 자바스크립트에선 컬렉션 개체가 되죠) 만 시리얼라이즈 할 수 있습니다. 함수도 해보려고 했는데 PHP에서는 함수의 이름만을 가져오는 반면에 자바스크립트는 함수의 코드 전체를 가지고 와서 다루기 힘들길래 제외시켰습니다. 단순 배열정도의 처리에만 사용하셨으면 합니다.
*브라우저정보)
IE6+, 모질라1.5 (다른 브라우저는 없어서 테스트해보지 않았습니다)
예전에 PHP -> 자바스크립트로 serialize 시켜서 통신하는 것을 보았는데, 그 반대 방향도 가능했으면 좋겟다는 생각에 만들어본 함수입니다. 솔직히 만든 저 역시 아직 사용처를 정하지 못했지만, 어딘가에는 쓸만한 곳이 있을 듯 하여 공개합니다. -_-;;
*소스)
function serialize (obj) {
var idx, len=0, retStr = '';
switch(typeof(obj)) {
case 'number':
if (parseInt(obj) == obj) retStr = 'i:' + obj + ';';
else retStr = 'd:' + obj + ';';
break;
case 'string':
retStr = 's:' + obj.length + ':"' + obj + '";'
break;
case 'null':
retStr = 'N;';
break;
case 'object':
if (obj == null) {
retStr = 'N;';
} else if (typeof(obj.reverse) == 'function') {
retStr = 'a:' + obj.length + ':{';
for (idx in obj) {
if (parseInt(idx).toString() == idx) idx = parseInt(idx);
retStr += serialize(idx) + serialize(obj[idx]);
}
retStr += '}';
} else {
for (idx in obj) {
if (parseInt(idx).toString() == idx) idx = parseInt(idx);
retStr += serialize(idx) + serialize(obj[idx]);
len++;
}
retStr = 'a:' + len + ':{' + retStr + '}';
}
break;
default:
retStr = 'N;';
}
return retStr;
}
*주의)
메소드와 프로퍼티가 공존하는 객체형은 제대로 된 결과를 얻을 수 없습니다. 자바스크립트의 객체모델과 PHP의 객체모델이 좀 달라서 이 부분은 제대로 할 수 없더군요. 숫자, 문자열, 숫자인덱스 배열, 문자열인덱스 배열(이 부분이 자바스크립트에선 컬렉션 개체가 되죠) 만 시리얼라이즈 할 수 있습니다. 함수도 해보려고 했는데 PHP에서는 함수의 이름만을 가져오는 반면에 자바스크립트는 함수의 코드 전체를 가지고 와서 다루기 힘들길래 제외시켰습니다. 단순 배열정도의 처리에만 사용하셨으면 합니다.
*브라우저정보)
IE6+, 모질라1.5 (다른 브라우저는 없어서 테스트해보지 않았습니다)
관련자료
-
링크
댓글 0
등록된 댓글이 없습니다.