以前写 PHPRPC 实现时,JavaScript 版本的序列化实现是修改自 http://www.devpro.it/code/102.html 的,这个实现虽然目前仍然在更新,不过它并没有完全实现 PHP 序列化的所有标记,因此它无法序列化复杂对象,例如嵌套对象,也无法反序列化所有的 PHP 序列化以后的内容。因此我重新编写了一个实现,这个实现与 PHP 5 的序列化完全兼容,并且可以反序列化 PHP 4、PHP 5 和 PHP 6 序列化的内容。支持魔术方法 __sleep 和 __wakeup,支持实现了 Serializable 接口的序列化和反序列化(在 javaScript 没有接口的概念,因此只要对象中包含 serialize 和 unserialize 方法就可以了,关于 Serializable 接口与自定义序列化的更多内容请参见:PHP 序列化(serialize)格式详解――自定义对象序列化)。该实现兼容以下版本的浏览器(已测试):

//IE 4+(包括 Windows Vista 的 IE 7+ 与 Windows Mobile 2003/Windows Moblie 5 的 IE 4)

//Mozilla/Firefox

//Opera(包括 Opera Mini 和 Opera Mobile,但对于 Opera Mobile 8.5 beta 2 for Windows Mobile 5 Pocket PC 对象序列化时,对象名的序列化支持的不完整,而其他版本都正常。)

//Konqueror

//Safari

//Epiphany

//其他浏览器未测试,但应该基本上只要支持 JavaScript 的浏览器都可以支持(有条件的用户希望能够帮忙测试)。

本程序中需要调用 utf.js 中的 utf16to8 和 utf8to16 这两个函数来进行字节流与 JavaScript 字符串之间的转换。

下载: phpserializer.js

/* 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

* 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

*/

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);

sb[p++] = 's:' + utf8.length + ':"';

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));

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[r];

}

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();

}

测试页面:http://test.coolcode.cn/phpserializer

http://www.gaodaima.com/27790.html

欢迎大家阅读《JavaScript 版本的 PHP serialize/unse..._js》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码

微信 赏一包辣条吧~

支付宝 赏一听可乐吧~

php unhtml包,JavaScript 版本的 PHP serialize/unse_js相关推荐

  1. js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现

    下载: phpserializer.js/* phpserializer.js - JavaScript to PHP serialize / unserialize class. * * This ...

  2. JavaScript版本变迁历史

    本文翻译JavaScript Versions: How JavaScript has changed over the years 原文写于2020/12/18 文章目录 JavaScript版本变 ...

  3. 介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现

    内表操作是ABAP开发人员几乎在每个ABAP程序里都会遇到的. 看一个例子:有两个行结构不一样的内表,每个内表的行结构有三列,除了name这一列名字一致外,其他两列的名称都不同,下图用红色和蓝色标注出 ...

  4. 第11章[11.6] Ext JS 自行搭建远端库的包升级版本后找不到的问题解决-The following versions are available

    问题: 自行搭建的远端库的某个包版本升级后找不到升级后的包, 错误信息类似: [ERR] Cannot satisfy requirements for "your-package" ...

  5. 集装箱编号校验码规则(JavaScript版本)

    集装箱编号校验码规则(JavaScript版本) 最近需要用到校验集装箱号是正确,网上搜了搜箱号的校验规则,写了份demo 贴上具体的计算方法, 参考点这里 懒的点的可以看我复制粘贴然后整理的的部分 ...

  6. J-Link软件和文档包的版本发行说明(2)[V4.96 ~ V6.12j版本]

    官方链接:https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html J-Link软件和文档包的版本发行说明(1)[V3.00d ~ ...

  7. npm查看一个包的版本信息

    我们npm install安装一个包之后,怎么查看这个包的版本信息呢?过一段时间之后,如何查看这个包最新的版本信息呢?下面将做一个全面的总结. 1.查看项目中安装的所有的包 npm list 结果如下 ...

  8. J-Link软件和文档包的版本发行说明(3)[V6.14 ~ V6.48b版本]

    官方链接:https://www.segger.com/downloads/jlink/ReleaseNotes_JLink.html J-Link软件和文档包的版本发行说明(1)[V3.00d ~ ...

  9. java 获取apk版本号_纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限...

    [实例简介] 纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限... 代码讲解地址:http://blog.csdn.net/chillax_li/article/details/4185 ...

最新文章

  1. jupyter配置默认启动目录
  2. PHP语法分析器:RE2C BISON 总结
  3. (剑指Offer)面试题1:赋值运算符函数
  4. VS中查看子类对象内存分布的方法
  5. 再次梳理css3动画部分知识
  6. python数据分析常用包之Scipy
  7. 微信小程序-音频播放-wx.createInnerAudioContext() 每次都是重复播放同一条录音
  8. jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)
  9. 赚钱有捷径吗?为什么有的人赚钱很容易
  10. 埃森哲物联网报告:制造业向智能服务转型的新引擎
  11. CSS学习总结(3)——CSS文本样式(属性)
  12. 联想哪款服务器性能,联想深腾7000高性能服务器
  13. 黑马python培训靠谱吗-黑马程序员的Python怎么样?
  14. 使用自己的激光雷达在cartographer导航框架下绘制地图,报错 lua_parameter_dictionary.cc:83] Check failed: status == 0解决方法。
  15. 三十六以内某进制下的数转换为另一进制下的数(递归版,迭代版)——秦九昭算法
  16. html网页设计导航栏制作教程,使用CSS制作立体导航栏
  17. 主板点不亮 复位BIOS_【硬件篇】主板排线怎么插?确认过眼神,就是这么简单!...
  18. 2018区块链概念股龙头
  19. python urlencode函数 adb打开,Python urlencode和unquote函数使用实例解析
  20. 微信推文中图片无法保存的解决方案

热门文章

  1. python文本字符分析
  2. 心得分享——c语言如何将多个字符串赋值给字符串数组(即c语言如何输入并储存多个字符串)
  3. 物联网主要应用在哪些领域
  4. 方便、免费的PDF在线处理网站汇总:PDF合并、文字编辑、页面提取与删除、格式转换…
  5. JAVA高并发多线程必须懂的50个问题
  6. edittextview 取消下划线
  7. 车牌识别之字符切割2
  8. 基于Eureka服务治理的高可用性注册中心搭建
  9. 浪漫又务实的华为自研之路: 始于情怀,终于智能
  10. 基于MATLAB的批量3度带高斯正算(LB--xy)