`

javascript中模仿php的serialize和unserialize序列化函数

阅读更多
/* phpserializer.js - JavaScript to PHP serialize / unserialize class. 
*  
* This class is designed to convert php variables to javascript 
* and javascript variables to php with a php serialize unserialize 
* compatible way. 
* 
* Copyright (C) 2006 Ma Bingyao <andot@ujn.edu.cn> 
* Version: 3.0c 
* LastModified: Jun 2, 2006 
* This library is free.  You can redistribute it and/or modify it. 
* http://www.coolcode.cn/?p=171
* 
*2011-01-05 likefei edit without encoding
*ser_string()
*unser_string()
*
*gbk encoding
*不同的编码中文的长度不同,需要调整一下函数
*chkLength(strTemp)
*/ 
  
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*function\s*)|(\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(['typeof(', cn, ') == "undefined"'].join(''))) { 
            eval(['function ', cn, '(){}'].join('')); 
        } 
        var o = eval(['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) == '\0') { 
                k = k.substring(k.indexOf('\0', 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(['typeof(', cn, ') == "undefined"'].join(''))) { 
            eval(['function ', cn, '(){}'].join('')); 
        } 
        var o = eval(['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<strTemp.length;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;
} 

 

分享到:
评论

相关推荐

    php序列化函数serialize() 和 unserialize() 与原生函数对比

    在PHP中,序列化是将变量转换为可存储或传输的字符串的过程,而反序列化则是将该字符串恢复为原始变量。PHP提供了两种主要的序列化方法:`serialize()` 和 `unserialize()` 以及 `json_encode()` 和 `json_decode()`...

    PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

    PHP提供了两种序列化和反序列化的机制,即使用serialize()和unserialize()函数进行PHP特有的序列化与反序列化,以及使用json_encode()和json_decode()函数进行JSON格式的序列化与反序列化。 首先,让我们来分析一下...

    se_mouz_image.rar_serialize_序列化

    在这个“se_mouz_image.rar_serialize_序列化”的主题中,我们将深入探讨如何利用`serialize()`函数来序列化文档以及实现鼠标画图功能。 首先,我们来详细解释一下`serialize()`函数。`serialize()`是PHP内建的一个...

    PHP中json_encode、json_decode与serialize、unserialize的性能测试分析

    Serialize序列化后的数据可能包含函数、对象和闭包等PHP特有的信息,这些信息在不同PHP版本间可能会有兼容性问题,而且也可能不被其他语言所支持。相反,JSON格式更加标准化,更容易被不同的编程语言和平台所接受。 ...

    PHP的serialize序列化数据以及JSON格式化数据分析

    在PHP中,经常使用的序列化方式包括了PHP原生的serialize以及更为通用的JSON格式化。以下是根据给定文件信息,对PHP的serialize序列化和JSON格式化数据分析的知识点进行详细说明。 首先,PHP的serialize函数的作用...

    serializededitor用于编辑已在PHP中序列化数据的Vuejs组件

    在PHP中,`serialize`和`unserialize`函数就是用来进行序列化和反序列化的。在前端开发领域,Vue.js是一个流行的轻量级渐进式JavaScript框架,它提供了构建用户界面的强大工具。现在,我们将深入探讨"serialized-...

    PHP多种序列化/反序列化的方法详解

    本文将详细讲解PHP中实现序列化和反序列化的多种方法,包括serialize和unserialize、json_encode和json_decode、var_export和eval以及wddx_serialize_value和wddx_deserialize。 1. serialize和unserialize `...

    解析PHP多种序列化与反序列化的方法

    本文将深入解析PHP中常见的序列化与反序列化方法。 1. `serialize` 和 `unserialize` 函数 `serialize` 是PHP内建的一个函数,用于将变量转换为一个字符串,该字符串可以被 `unserialize` 函数还原为原始的变量形式...

    unserialize:jQuery 反序列化插件

    也就是说,“序列化”采用一种形式(或输入的集合)并为 HTTP 请求返回正确的序列化字符串,此插件中的函数采用该序列化字符串,然后执行以下两种可能的操作之一: 根据字符串中的值在表单中设置每个输入(包括...

    php数据序列化测试实例详解

    3. **serialize**:这是PHP内置的序列化方法,可以将任何PHP变量转换为一个字符串,然后在需要的时候通过unserialize()函数还原。然而,相比于msgpack和json,serialize在时间和空间效率上相对较差,但在处理PHP特定...

    PHP和JS字符串处理函数.pdf

    `serialize()`和`unserialize()`是PHP中处理复杂数据结构的工具。`serialize()`将变量转化为可存储的字符串形式,而`unserialize()`能将这个字符串再转换回原生的PHP值。 `json_encode()`和`json_decode()`是PHP...

    总结对比php中的多种序列化

    首先,`serialize`和`unserialize`是PHP内置的序列化和反序列化函数。`serialize`函数接受一个变量作为参数,将其转化为字符串,这个字符串包含了变量的所有信息,包括类型和结构。例如,当序列化一个数组时,输出的...

    php 中序列化和json使用介绍

    在PHP中,可以使用`serialize()`函数进行序列化操作,而`unserialize()`用于反序列化。序列化的字符串通常包含特殊字符和标识符,以便在反序列化时能正确解析数据结构。 序列化具有以下特点: 1. 包含对象的所有...

    PHP序列化的四种实现方法与横向对比

    - `serialize()` 是PHP中最基础的序列化函数,它可以将任何变量(包括数组和对象)转换为字符串。例如,一个数组`$a`在序列化后会得到类似`a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}...

    PHP 数组和字符串互相转换实现方法.rar

    3. `serialize()` 和 `unserialize()` 函数:`serialize()`可以将PHP值转换为可存储的字符串形式,而`unserialize()`则可以将该字符串反序列化回原始的PHP值。不过,这种方法通常用于存储和恢复变量,而不是简单的...

    php100经典实例

    在PHP中,可能使用`serialize()`和`unserialize()`函数来序列化和反序列化购物车数据。同时,购物车系统也需要考虑安全性问题,防止SQL注入等攻击。 3. **登录系统**: 登录系统是网站安全的重要组成部分,主要...

Global site tag (gtag.js) - Google Analytics