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技术技巧大全(五)
Jan 22 Javascript
jquery ajax return没有返回值的解决方法
Oct 20 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
Jul 15 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
Jun 05 Javascript
Jquery 分页插件之Jquery Pagination
Aug 25 Javascript
跟我学习javascript的循环
Nov 18 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
srcElement表格样式
2006/09/03 Javascript
javascript Array.remove() 数组删除
2009/08/06 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
JS判断一个数是否是水仙花数
2017/06/11 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python人人网登录应用实例
2014/09/26 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
实习护理工作自我评价
2013/09/25 职场文书
共产党员承诺书
2014/03/25 职场文书
领导班子四风表现材料
2014/08/23 职场文书
观看信仰心得体会
2014/09/04 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers