/** * 反序列化。 * * @param DocReader 文档读取器 * @param clz 参考类 * @param object 参考对象 * @return 对象 */ private static Object deserializing(DocReader docReader, Class<?> clz, Object object) { // 准备工作 XBConfig xbConfig = XBConfigHelper.getXbConfig(); PathTracker pathTracker = new PathTracker(xbConfig.isUseRelativePath()); DocReader realDocReader = new PathTrackingReader(docReader, pathTracker); ObjectOperator objectOperator = ObjectOperatorFactory.createObjectOperator(); TransferInfo transferInfo = new TransferInfo(pathTracker, xbConfig, null, realDocReader, objectOperator); Object result = null; try { realDocReader.moveDown(); result = Deserializer.readUnknow(clz, object, null, transferInfo); // 处理引用失败的例子 handleUnfin(transferInfo); } catch (Exception e) { throw new RuntimeException("反序列化失败。", e); } finally { if (null != realDocReader) { try { realDocReader.close(); } catch (Exception e) { throw new RuntimeException("关闭输入流失败。", e); } if (null != realDocReader.getReader()) { try { realDocReader.getReader().close(); } catch (Exception e) { throw new RuntimeException("关闭输入流失败。", e); } } } } return result; }
/** * 序列化。如果不生成文件,则直接返回生成的字符串。 * * @param object 被序列化的对象 * @param docWriter 文档输出器 * @return 字符串 */ private static String serializing(Object object, DocWriter docWriter) { // 准备工作 XBConfig xbConfig = XBConfigHelper.getXbConfig(); docWriter.setXBConfig(xbConfig); PathTracker pathTracker = new PathTracker(xbConfig.isUseRelativePath()); DocWriter realDocWriter = new PathTrackingWriter(docWriter, pathTracker); TransferInfo transferInfo = new TransferInfo(pathTracker, xbConfig, realDocWriter, null, null); try { // 开始序列化 realDocWriter.writeStartDocument(); Serializer.writeUnknow(object, transferInfo, null); realDocWriter.writeEndDocument(); } catch (Exception e) { throw new RuntimeException("序列化失败。", e); } finally { if (null != realDocWriter) { try { realDocWriter.close(); } catch (Exception e) { throw new RuntimeException("关闭输出流失败。", e); } if (null != realDocWriter.getWriter()) { try { realDocWriter.getWriter().close(); } catch (Exception e) { throw new RuntimeException("关闭输出流失败。", e); } } } } return docWriter.getString(); }
/** * XBlink配置项小助手,通过她拿到当前需要的运行时配置信息。(应该是线程安全的) * * @author 胖五([email protected]) */ public class XBConfigHelper { /** 默认的配置项,全局唯一。在没有设定临时配置项时,以此配置为主。 */ private static XBConfig globalXbConfig = XBConfig.newXBConfig(); /** 临时的配置项,设定后调用就会采用当前配置项,调用后即抛弃。 */ private static ThreadLocal<XBConfig> transientXbConfig = new ThreadLocal<XBConfig>(); /** 临时调用计数器。(可设定调用次数) */ private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(); /** * 获得配置信息。 * * @return 配置信息 */ protected static XBConfig getXbConfig() { // 先查看是否有临时配置项 Integer current = count.get(); if (null == current || 0 == current.intValue()) { // 没有的情况下,使用默认配置项 return globalXbConfig; } XBConfig xbConfig = transientXbConfig.get(); transientXbConfig.set(null); count.set(0); return xbConfig; } protected static void setTransientXBConfig(XBConfig xbConfig) { transientXbConfig.set(xbConfig); count.set(1); } protected static void setGlobalXBConfig(XBConfig xbConfig) { globalXbConfig = xbConfig; } }