日期:2014-05-16  浏览次数:20315 次

XBlink中关于XML/JSON格式中引用对象的路径的实现思路

在将一个对象序列化过程中,引用对象的处理是一个常见问题。


随着新版本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节点就有两种不同的表示方式,一个文件中会混杂这两种格式,这就是个人觉得有稍许混乱的原因。


代码