魔法序列化库(JSON Version)
乖俺对JSON这种东西一直很郁闷在一点——不能保持引用,或者说一旦有数据岛结构,市面上的JSON Encoder绝对都会无限递归挂掉。于是俺想自己实现可以既使用json结构,又具备保存引用等功能的新型JSON序列化库。
一、标准JSON的不足
现在一一分析JSON的不足。
1、无法保存引用(无法保存图)。
var i = { "name":"i" };
var j = { "name":"j" };
i.j = i;
j.i = i;
SomeJSONEncoder.encode( i );
好的,至此,市面上的JSON Encoders绝对都挂了。
于是俺引入了统一的uid标记,为每个对象编号,并在反序列化时还原引用。
2、数组的缺陷。
JSON规范中,数组更像一个元组,其中虽然可以放对象,但是数组本身看上去并不像一个对象。
var parent:Array = [];
var child:Object = {};
child.parent = parent;
SomeJSONEncoder.encode( parent );
好的,至此,市面上的JSON Encoders再一次绝对地挂掉了。原理同1,只是问题在于,数组[]不能像对象{}一样按照1部分的形式进行扩展。
因此,俺毫不犹豫地把数组也对象化了,同时引入了class标记,用以还原。
二、俺的非标准JSON的优势和不足
1、可以保持引用和类型。
通过扩展的属性,MJSON(姑且这么叫它……)可以编码和还原对象的类型以及引用关系。
这,最起码不会因为编码数据岛而挂了。
2、虚拟和远程类型。
允许设置对象的虚拟类型,或者远程绑定类,这一点对于RPC来说很有用处,通过封装通道和编解码器,即可屏蔽B/S间的调用差异。
3、数组“看起来”对象化。
将数组改得面目全非(同样视为图),于是,在某些情况下,数组可以直接引用,减小体积。
var a1:Array = [ obj1, obj2, obj3... ];
var a2:Array = [ string1, string2, string3... ];
var a3:Array = [ some1, some2, some3... ];
var b:Array = [ a1, a2 ];
var c:Array = [ a1, a2, a3 ];
var d:Object = {};
d.b = b;
d.c = c;
Encoder.encode( d );
第二次用到的a1、a2会以引用方式出现,不像市面上的都傻傻地又编码一次。
当然了,Decoder还是可以反序列化标准JSON中的数组[]的。
4、高度的可自定义特性。
允许为Encoder加入自定义类型序列化逻辑,以及序列化时忽略的类型。
也允许为Decoder加入自定义类型反序列化逻辑,这样可以自己扩展更多的类型。
例如对XML类型,就是俺自定义实现的。
5、唯一也是最大的缺点。
嘿嘿,那就是不标准嘛~标准的JSON就是得那样,你看俺把数组都变对象图了。
当然了,如果让别的JSON库反序列化俺的JSON库生成的JSON,只是会丢失引用和类型数据,解析还是行的。
三、支持的语言。
目前Java版、ActionScript3版都已经哦了,理论上凡是支持反射的语言都可以实现。至于Mac大神想要的ObjC版,俺正在写呢,也快了。
四、革命。
JSON只是载体的一种形式,俺还有XML作为载体的形式,这些不同形式可以一并成为MSerialization Library。慢慢来吧。
对于序列化和反序列化,咱们革命一次吧。哈哈。
Download Here:MJSON Library.swc
Filed under: 未分类 - @ 2012年1月3日 下午2:51
支持一下. 😈