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执行一下,就得到类实例了。



相关阅读:
浅谈Windows 7的优缺点
我认为JSP有问题(下)
修改、删除数据记录(DELETE\UPDATE)
开发人员必知的28个HTML5新特性及技巧
PHP 程序员应该使用的10个组件
身份验证方面的函数
JavaScript类和继承 this属性使用说明
JavaScript arguments 多参传值函数
重定向实现代码
兼容firefox的给每一个onClick再附加一个事件
Atlas学习手记(19):客户端简单控件介绍
PHP Header用于页面跳转要注意的几个问题总结
linux at命令和batch从输入或指定文件读取命令
1.PHP简介
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 招潮蟹观察记 一只迷路的蝙蝠 科幻作文(八篇) 多彩的春天余光敏作文300字 初中初二作文1200字:我和书的故事 大雨滂沱人憔悴 我拼了一个飞船 餐桌上的亲民 写事物带来的启示700字作文:落叶的启示 爸爸妈妈我想对你说 高中中考作文700字:重返三国之曹操杀敌 馈赠 小兔迷路了400字 5S内部审核 学会自立——读《鲁宾逊漂流记》有感作文750字 初中初一作文700字:最喜欢的妈妈 关于景物描写的句子 渐趋于沉寂的都市,此刻闪耀着煤气灯的灯光 爱如等待 秋风娃娃作文400字 高中高三作文2650字:视频聊天室里的故事 泪葬红尘【一千年的轮回】 那些海底的石块 2016年国土所工作总结及2017年工作计划 沙子与珍珠的思考 临时用工合同通用版 八荣八耻荣辱观演讲 及时行孝,莫留遗憾 现在的我不代表以后的我 小树苗,快长大 一件羊毛针织毛衣,给母亲带去一丝温暖 娇惯 给妈妈的信作文700字 装病遇险记 缘来,爱;缘去,散 小学四年级作文350字:“帮助”历难记 外婆的资金200字 天涯秋绪,一叶知心 走一步学会仰头看海阔,未来还有你 灰姑娘(5) 现在的你是自己曾经喜欢的样子吗? 国家领导人出访咋安排 八荣八耻工作总结_工作总结范文 环保手抄报内容:环保一小步 Cherish作文450字 2015年阜康市政府工作报告全文 笑容在阳光里——《嗨,伙伴》观后感 — 每句话都是一个故事,触动人心的微小说 毕业之后请不要将我忘记哦 读《我爱露珠》有感 过去的,真的过去了吗?作文900字

Copyright © 2016 phpStudy |