js 解析php serialize,js中模仿php的serialize和unserialize序列化函数

function serialize(o) {

var p = 0, sb = [], ht = [], hv =

1;

function classname(o)

{

if (typeof(o) =="undefined"||

typeof(o.constructor) =="undefined") return

'';

var c =

o.constructor.toString();

c = utf16to8(c.substr(0,

c.indexOf('(')).replace(/(^s*functions*)|(s*$)/ig,

''));

return ((c == '') ? 'Object' :

c);

}

function is_int(n)

{

var s = n.toString(), l =

s.length;

if (l > 11) return

false;

for (var i = (s.charAt(0) == '-') ? 1 :

0; i < l; i++) {

switch (s.charAt(i))

{

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

break;

default : return

false;

}

}

return !(n < -2147483648

|| n > 2147483647);

}

function in_ht(o)

{

for (k in ht) if (ht[k] === o) return

k;

return

false;

}

function ser_null()

{

sb[p++] =

'N;';

}

function ser_boolean(b)

{

sb[p++] = (b ? 'b:1;' :

'b:0;');

}

function ser_integer(i)

{

sb[p++] = 'i:' + i +

';';

}

function ser_double(d)

{

if (d == Number.POSITIVE_INFINITY) d =

'INF';

else if (d == Number.NEGATIVE_INFINITY)

d = '-INF';

sb[p++] = 'd:' + d +

';';

}

function ser_string(s)

{

//var utf8 = utf16to8(s);

var utf8 = s;//当判断是中文时不进行编码转换

sb[p++] = 's:' + chkLength(utf8) +

':"';

sb[p++] =

utf8;

sb[p++] =

'";';

}

function ser_array(a)

{

sb[p++] =

'a:';

var lp = p;

sb[p++] =

0;

sb[p++] =

':{';

for (var k in a)

{

if (typeof(a[k]) != 'function')

{

is_int(k) ? ser_integer(k) :

ser_string(k);

__serialize(a[k]);

sb[lp]++;

}

}

sb[p++] =

'}';

}

function ser_object(o)

{

var cn =

classname(o);

if (cn == '')

ser_null();

else if (typeof(o.serialize) !=

'function') {

sb[p++] = 'O:' + cn.length +

':"';

sb[p++] =

cn;

sb[p++] =

'":';

var lp = p;

sb[p++] =

0;

sb[p++] =

':{';

if (typeof(o.__sleep) == 'function')

{

var a =

o.__sleep();

for (var kk in a)

{

ser_string(a[kk]);

__serialize(o[a[kk]]);

sb[lp]++;

}

}

else {

for (var k in o)

{

if (typeof(o[k]) != 'function')

{

ser_string(k);

__serialize(o[k]);

sb[lp]++;

}

}

}

sb[p++] =

'}';

}

else {

var cs =

o.serialize();

sb[p++] = 'C:' + cn.length +

':"';

sb[p++] =

cn;

sb[p++] = '":' + cs.length +

':{';

sb[p++] =

cs;

sb[p++]

="}";

}

}

function ser_pointref(R)

{

sb[p++] ="R:"+ R

+";";

}

function ser_ref(r)

{

sb[p++] ="r:"+ r

+";";

}

function __serialize(o)

{

if (o == null || o.constructor ==

Function) {

hv++;

ser_null();

}

else switch (o.constructor)

{

case Boolean:

{

hv++;

ser_boolean(o);

break;

}

case Number:

{

hv++;

is_int(o) ? ser_integer(o) :

ser_double(o);

break;

}

case String:

{

hv++;

ser_string(o);

break;

}

case Array:

{

var r =

in_ht(o);

if (r) {

ser_pointref(r);

}

else {

ht[hv++] =

o;

ser_array(o);

}

break;

}

default: {

var r =

in_ht(o);

if (r) {

hv++;

ser_ref(r);

}

else {

ht[hv++] =

o;

ser_object(o);

}

break;

}

}

}

__serialize(o);

return

sb.join('');

}

function unserialize(ss) {

var p = 0, ht = [], hv = 1; r =

null;

function unser_null()

{

p++;

return

null;

}

function unser_boolean()

{

p++;

var b = (ss.charAt(p++) ==

'1');

p++;

return b;

}

function unser_integer()

{

p++;

var i = parseInt(ss.substring(p, p =

ss.indexOf(';', p)));

p++;

return i;

}

function unser_double()

{

p++;

var d = ss.substring(p, p =

ss.indexOf(';', p));

switch (d)

{

case 'INF': d =

Number.POSITIVE_INFINITY; break;

case '-INF': d =

Number.NEGATIVE_INFINITY; break;

default: d =

parseFloat(d);

}

p++;

return d;

}

function unser_string()

{

p++;

var l = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

//var s = utf8to16(ss.substring(p, p +=

l));

//var s = ss.substring(p, p +=

l);

var s = subChnStr(ss,l,p);

p += s.length;

p += 2;

return s;

}

function unser_array()

{

p++;

var n = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

var a = [];

ht[hv++] =

a;

for (var i = 0; i < n;

i++) {

var k;

switch (ss.charAt(p++))

{

case 'i': k = unser_integer();

break;

case 's': k = unser_string();

break;

case 'U': k = unser_unicode_string();

break;

default: return

false;

}

a[k] =

__unserialize();

}

p++;

return a;

}

function unser_object()

{

p++;

var l = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

var cn = utf8to16(ss.substring(p, p +=

l));

p += 2;

var n = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

if (eval_r(['typeof(', cn, ')

=="undefined"'].join(''))) {

eval_r(['function ', cn,

'(){}'].join(''));

}

var o = eval_r(['new ', cn,

'()'].join(''));

ht[hv++] =

o;

for (var i = 0; i < n;

i++) {

var k;

switch (ss.charAt(p++))

{

case 's': k = unser_string();

break;

case 'U': k = unser_unicode_string();

break;

default: return

false;

}

if (k.charAt(0) == '')

{

k = k.substring(k.indexOf('', 1) + 1,

k.length);

}

o[k] =

__unserialize();

}

p++;

if (typeof(o.__wakeup) == 'function')

o.__wakeup();

return o;

}

function unser_custom_object()

{

p++;

var l = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

var cn = utf8to16(ss.substring(p, p +=

l));

p += 2;

var n = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

if (eval_r(['typeof(', cn, ')

=="undefined"'].join(''))) {

eval_r(['function ', cn,

'(){}'].join(''));

}

var o = eval_r(['new ', cn,

'()'].join(''));

ht[hv++] =

o;

if (typeof(o.unserialize) != 'function')

p += n;

else o.unserialize(ss.substring(p, p +=

n));

p++;

return o;

}

function unser_unicode_string()

{

p++;

var l = parseInt(ss.substring(p, p =

ss.indexOf(':', p)));

p += 2;

var sb =

[];

for (i = 0; i < l; i++)

{

if ((sb[i] = ss.charAt(p++)) == '\')

{

sb[i] =

String.fromCharCode(parseInt(ss.substring(p, p += 4),

16));

}

}

p += 2;

return

sb.join('');

}

function unser_ref()

{

p++;

var r = parseInt(ss.substring(p, p =

ss.indexOf(';', p)));

p++;

return ht

­;

}

function __unserialize()

{

switch (ss.charAt(p++))

{

case 'N': return ht[hv++] =

unser_null();

case 'b': return ht[hv++] =

unser_boolean();

case 'i': return ht[hv++] =

unser_integer();

case 'd': return ht[hv++] =

unser_double();

case 's': return ht[hv++] =

unser_string();

case 'U': return ht[hv++] =

unser_unicode_string();

case 'r': return ht[hv++] =

unser_ref();

case 'a': return

unser_array();

case 'O': return

unser_object();

case 'C': return

unser_custom_object();

case 'R': return

unser_ref();

default: return

false;

}

}

return

__unserialize();

}

//gbk encoding下的中文字符长度

function chkLength(strTemp)

{

var i,sum;

sum=0;

for(i=0;i

{

if

((strTemp.charCodeAt(i)>=0)

&&

(strTemp.charCodeAt(i)<=255))

sum=sum+1;

else

sum=sum+2;

}

return sum;

}

//gbk encoding中文字符截取(中文占两个字符)

//utf8 encoding中文字符截取(中文占三个字符)

//做的改动:增加截取字符串的开始位置

function subChnStr(str, len, start, hasDot)

{

var newLength = 0;

var newStr ="";

var chineseRegex =

/[^x00-xff]/g;

var singleChar ="";

var strLength =

str.replace(chineseRegex,"**").length;

for(var i = start;i <

strLength;i++)

{

singleChar =

str.charAt(i).toString();

if(singleChar.match(chineseRegex) !=

null)

{

newLength += 2;

}

else

{

newLength++;

}

if(newLength >

len)

{

break;

}

newStr += singleChar;

}

if(hasDot

&& strLength >

len)

{

newStr +="...";

}

return newStr;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值