魔法序列化库(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

《魔法序列化库(JSON Version)》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注