日期:2014-05-16 浏览次数:20333 次
在将一个对象序列化过程中,引用对象的处理是一个常见问题。
随着新版本XBlink的即将推出,这个老大难问题就需要慎重解决。
在0.7.0版中,引用虽然已经能够正确处理,但是实现方式是采用了对象出现先后顺序为标记,采用数字的方式来实现引用。
例如 A包含B,B包含C,C包含A,C也包含B。生成的XML如下:
<A>
<B>
<C>
<A ref="1"/><!-- A是第一个序列化的对象,ID设置为1 -->
<B ref="2"/><!-- B是第二个序列化的对象,ID设置为2 -->
</C>
</B>
</A>
?
这个摸样虽然没错,但是在难以阅读。(毕竟序列化为XML的优点之一就是其可读性好,如果不好,那还不如用其他格式)
新版本的开发决定彻底解决这个问题,让引用路径可以清楚表示出其对象位置。
思考后,解决方式就是生成常见的两种路径:相对路径 绝对路径
在这个实现过程中,看了下Fastjson与XStream的实现方式,发现以下几点问题:
首先说说温少的Fastjson的实现方式
这里有温少的一个思路和最终实现。
这里的路径感觉有稍许混乱,有的是相对路径,例如使用..来引用上级对象,但也有几个特殊符号,使得有的路径又变成了绝对路径,例如使用对于根节点使用$来表示,自身使用@来表示。
个人认为这样会产生一个问题,例如上面那个ABC的例子,可以有两种表现形式
<A>
<B>
<C>
<A ref="$"/>
<B ref="../.."/>
</C>
</B>
</A>
<!-- 下面这种也是正确的 -->
<A>
<B>
<C>
<A ref="../../.."/>
<B ref="$.B"/>
</C>
</B>
</A>
?
像例子中关于B节点就有两种不同的表示方式,一个文件中会混杂这两种格式,这就是个人觉得有稍许混乱的原因。
代码