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 Excel操作知识点
Apr 24 Javascript
jquery查找tr td 示例模拟
May 08 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
JavaScript运动减速效果实例分析
Aug 04 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
js+html实现点名系统功能
Nov 05 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
让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
桌面中心(二)数据库写入
2006/10/09 PHP
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
python传递参数方式小结
2015/04/17 Python
PyMongo安装使用笔记
2015/04/27 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
解决Python对齐文本字符串问题
2019/08/28 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
大一期末自我鉴定
2013/12/13 职场文书
科级干部考察材料
2014/02/15 职场文书
疾病防治方案
2014/05/31 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
2014年公司工作总结
2014/11/22 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
七年级作文之英语老师
2019/10/28 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python