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

简介:

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

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

None.gifObject.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',  truefunction(){ return 'keke';},  new Object()];
None.gifalert(obj4.Serialize());

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


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
8天前
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
|
17天前
|
JavaScript 前端开发
Math对象:JavaScript中的数学工具
Math对象:JavaScript中的数学工具
26 1
N..
|
25天前
|
存储 JavaScript 前端开发
JavaScript中的对象
JavaScript中的对象
N..
10 0
|
28天前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
|
11天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
2天前
|
JavaScript
【Js】检查Date对象是否为Invalid Date
【Js】检查Date对象是否为Invalid Date
5 0
|
3天前
|
存储 JavaScript 前端开发
JavaScript的引用数据类型主要包括对象
【4月更文挑战第16天】JavaScript的引用数据类型主要包括对象
14 4
|
5天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
15 5
|
8天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`&#39;1.2,2,3,4,5&#39;`)转换为对象数组。通过使用`split(&#39;,&#39;)`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。