JavaScript对象也玩序列化和反序列化

    前些天说过关于JavaScript的Literal Syntax问题,觉得挺有意思的,于是又研究了一下,能不能把对象再转化为Literal形式呢?就像我们平时说的序列化和反序列化啥的。当然可以了,因为JavaScript对象自身都提供了一个toString()方法,默认就是返回简单对象的Literal形式。

    我们需要作的就是判断对象的具体类型,然后分别Serialize每种对象,再输出为Object的Literal语法形式就行了。准确的判断对象类型,使用我曾经说过的__typeof__方法就行了,序列化对象实例的代码如下:

None.gif Object.prototype.Serialize  =   function ()
None.gif{
None.gif    
var  type  =  __typeof__( this );
None.gif    
switch (type)
None.gif    {
None.gif         
case  'Array' :
None.gif         {
None.gif              
var  strArray  =  '['; 
None.gif              
for  (  var  i = 0  ; i  <   this .length ;  ++ i )
None.gif              {
None.gif                   
var  value  =  ''; 
None.gif                   
if  (  this [i] )
None.gif                   {
None.gif                        value 
=   this [i].Serialize();
None.gif                   }
None.gif                   strArray 
+=  value  +  ',';
None.gif              }
None.gif              
if  ( strArray.charAt(strArray.length - 1 ==  ',' )
None.gif              {
None.gif                   strArray 
=  strArray.substr( 0 , strArray.length - 1 );
None.gif              }
None.gif              strArray 
+=  ']';  
None.gif              
return  strArray;
None.gif         }
None.gif         
case  'Date' :
None.gif         {
None.gif              
return  ' new  Date('  +   this .getTime()  +  ')';
None.gif         }
None.gif         
case  'Boolean' :
None.gif         
case  'Function' :
None.gif         
case  'Number' :
None.gif         
case  'String' :
None.gif         {
None.gif              
return   this .toString();
None.gif         }
None.gif         
default  :
None.gif         {
None.gif              
var  serialize  =  '{'; 
None.gif              
for  (  var  key  in   this  )
None.gif              {
None.gif                   
if  ( key  ==  'Serialize' )  continue
None.gif                   
var  subserialize  =  ' null ';
None.gif                   
if  (  this [key]  !=  undefined )
None.gif                   {
None.gif                        subserialize 
=   this [key].Serialize();
None.gif                   }
None.gif                   serialize 
+=  '\r\n'  +  key  +  ' : '  +  subserialize  +  ',';
None.gif              }
None.gif              
if  ( serialize.charAt(serialize.length - 1 ==  ',' )
None.gif              {
None.gif                   serialize 
=  serialize.substr( 0 , serialize.length - 1 );
None.gif              }
None.gif              serialize 
+=  '\r\n}';
None.gif              
return  serialize;
None.gif         }
None.gif    }
None.gif};

    其实就是Array和Object的属性比较的麻烦,需要递归的做这个Serialize操作。不过需要注意,Serialize方法就不需要被序列化出来了。下面是测试示例,不过这个序列化方法没有对环状引用做检查,能序列化的对象很有限。

None.gif var  obj1  =  []; 
None.gifalert(obj1.Serialize());
None.gif
None.gif
var  obj2  =  [ 1 ,[ 2 ,[ 3 ,[ 4 ,[ 5 ,[ 6 ,[ 7 ,[ 8 ,[ 9 ,[ 0 ]]]]]]]]]];
None.gifalert(obj2.Serialize());
None.gif
None.gif
var  obj3  =  
None.gif    {
None.gif         Properties1 : 
1 , Properties2 : ' 2 ', Properties3 : [ 3 ],
None.gif         Method1 : 
function (){  return   this .Properties1  +   this .Properties3[ 0 ];},
None.gif         Method2 : 
function (){  return   this .Preperties2; }
None.gif    };
None.gifalert(obj3.Serialize());  
None.gif
None.gif
var  obj4  =  [ null 1 , 'string',  true function (){ return  'keke';},  new  Object()];
None.gifalert(obj4.Serialize());

    至于反序列化就非常的容易了,把上面的序列化结果用eval执行一下,就得到类实例了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值