JavaScript 序列化对象实现代码


Posted in Javascript onDecember 18, 2009

JavaScript 序列化对象实现代码
作者发的是一张图,大家可以放大看。

前些天说过关于JavaScript的Literal Syntax问题,觉得挺有意思的,于是又研究了一下,能不能把对象再转化为Literal形式呢?就像我们平时说的序列化和反序列化啥的。当然可以了,因为JavaScript对象自身都提供了一个toString()方法,默认就是返回简单对象的Literal形式。

我们需要作的就是判断对象的具体类型,然后分别Serialize每种对象,再输出为Object的Literal语法形式就行了。准确的判断对象类型,使用我曾经说过的__typeof__方法就行了,序列化对象实例的代码如下:

Object.prototype.Serialize = function() 
{ 
var type = __typeof__(this); 
switch(type) 
{ 
case 'Array' : 
{ 
var strArray = '['; 
for ( var i=0 ; i < this.length ; ++i ) 
{ 
var value = ''; 
if ( this[i] ) 
{ 
value = this[i].Serialize(); 
} 
strArray += value + ','; 
} 
if ( strArray.charAt(strArray.length-1) == ',' ) 
{ 
strArray = strArray.substr(0, strArray.length-1); 
} 
strArray += ']'; 
return strArray; 
} 
case 'Date' : 
{ 
return 'new Date(' + this.getTime() + ')'; 
} 
case 'Boolean' : 
case 'Function' : 
case 'Number' : 
case 'String' : 
{ 
return this.toString(); 
} 
default : 
{ 
var serialize = '{'; 
for ( var key in this ) 
{ 
if ( key == 'Serialize' ) continue; 
var subserialize = 'null'; 
if ( this[key] != undefined ) 
{ 
subserialize = this[key].Serialize(); 
} 
serialize += '\r\n' + key + ' : ' + subserialize + ','; 
} 
if ( serialize.charAt(serialize.length-1) == ',' ) 
{ 
serialize = serialize.substr(0, serialize.length-1); 
} 
serialize += '\r\n}'; 
return serialize; 
} 
} 
};

其实就是Array和Object的属性比较的麻烦,需要递归的做这个Serialize操作。不过需要注意,Serialize方法就不需要被序列化出来了。下面是测试示例,不过这个序列化方法没有对环状引用做检查,能序列化的对象很有限。
var obj1 = []; 
alert(obj1.Serialize()); var obj2 = [1,[2,[3,[4,[5,[6,[7,[8,[9,[0]]]]]]]]]]; 
alert(obj2.Serialize()); 
var obj3 = 
{ 
Properties1 : 1, Properties2 : '2', Properties3 : [3], 
Method1 : function(){ return this.Properties1 + this.Properties3[0];}, 
Method2 : function(){ return this.Preperties2; } 
}; 
alert(obj3.Serialize()); 
var obj4 = [null, 1, 'string', true, function(){return 'keke';}, new Object()]; 
alert(obj4.Serialize());

至于反序列化就非常的容易了,把上面的序列化结果用eval执行一下,就得到类实例了。
Javascript 相关文章推荐
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
基于jquery实现的树形菜单效果代码
Sep 06 Javascript
全面解析Bootstrap表单使用方法(表单控件)
Nov 24 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
VUE中使用Vue-resource完成交互
Jul 21 Javascript
学习Vue组件实例
Apr 28 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
让div层随鼠标移动的实现代码 ie ff
Dec 18 #Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 #Javascript
javascript 导出数据到Excel(处理table中的元素)
Dec 18 #Javascript
event.srcElement 用法笔记e.target
Dec 18 #Javascript
Javascript document.referrer判断访客来源网址
May 15 #Javascript
Javascript 中介者模式实例
Dec 16 #Javascript
js textarea自动增高并隐藏滚动条
Dec 16 #Javascript
You might like
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
PHP的PDO连接讲解
2019/01/24 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
更改Python命令行交互提示符的方法
2015/01/14 Python
django实现前后台交互实例
2017/08/07 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
厨师个人自我鉴定范文
2014/04/19 职场文书
美国留学经济担保书
2014/05/20 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
2014年统战工作总结
2014/12/09 职场文书
二审答辩状格式
2015/05/22 职场文书
初中政治教学工作总结
2015/08/13 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
python爬取豆瓣电影TOP250数据
2021/05/23 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js