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不刷新实现浏览器的前进后退功能
Nov 05 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
PHP 数组current和next用法分享
Mar 05 Javascript
js实现文字超出部分用省略号代替实例代码
Sep 01 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
简单实现JavaScript图片切换效果
Nov 28 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
纯js仿淘宝京东商品放大镜功能
Mar 02 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP5中虚函数的实现方法分享
2011/04/20 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
详解vuex的简单使用
2018/03/12 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
python计算列表内各元素的个数实例
2018/06/29 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Python中print函数简单使用总结
2019/08/05 Python
python处理excel绘制雷达图
2019/10/18 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
商家认证委托书格式
2014/10/16 职场文书
先进教师事迹材料
2014/12/16 职场文书
求职自我评价范文
2015/03/09 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
公司出差管理制度范本
2015/08/05 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
MySQL详细讲解变量variables的用法
2022/06/21 MySQL