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 相关文章推荐
jquery 图片预加载 自动等比例缩放插件
Dec 25 Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 Javascript
JS弹出层的显示与隐藏示例代码
Dec 27 Javascript
微信小程序开发之实现自定义Toast弹框
Jun 08 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
vue实现element-ui对话框可拖拽功能
Aug 17 Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 Javascript
如何用RxJS实现Redux Form
Dec 29 Javascript
小程序实现悬浮搜索框
Jul 12 Javascript
JavaScript类的继承多种实现方法
May 30 Javascript
mustache.js实现首页元件动态渲染的示例代码
Dec 28 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
杏林同学录(八)
2006/10/09 PHP
初品cakephp 入门基础
2012/02/16 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP goto语句用法实例
2019/08/06 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
javascript学习之json入门
2016/12/22 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
python实现微信小程序自动回复
2018/09/10 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
Javascript如何发送一个Ajax请求
2015/01/26 面试题
高三霸气励志标语
2014/06/24 职场文书
入党函调证明材料
2014/12/24 职场文书
邀请书格式范文
2015/02/02 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
使用Pytorch训练two-head网络的操作
2021/05/28 Python
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL