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实现动态CSS换肤技术的脚本
Jun 29 Javascript
JavaScript更改class和id的方法
Oct 10 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
JavaScript中的数组操作介绍
Dec 30 Javascript
JavaScript实现简单获取当前网页网址的方法
Nov 09 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
深入学习Bootstrap表单
Dec 13 Javascript
Vue之Watcher源码解析(2)
Jul 19 Javascript
vue 使用ref 让父组件调用子组件的方法
Feb 08 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
angularjs自定义过滤器demo示例
Aug 24 Javascript
js实现九宫格抽奖
Mar 19 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
JavaScript 的继承
2011/10/01 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
vue debug 二种方法
2018/09/16 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
Python实用日期时间处理方法汇总
2015/05/09 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
python获取中文字符串长度的方法
2018/11/14 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
用python解压分析jar包实例
2020/01/16 Python
python入门之基础语法学习笔记
2020/02/08 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
乡镇三严三实学习心得体会
2014/10/13 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL