Beispiel #1
0
 /**
  * 反序列化。
  *
  * @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;
 }
Beispiel #2
0
 /**
  * 序列化。如果不生成文件,则直接返回生成的字符串。
  *
  * @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();
 }
Beispiel #3
0
/**
 * 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;
  }
}