XStream xml與java對象互相轉換,自動識別java


XStream Utils 類:

/**
 * XStream 僅支持not auto-detected下線程安全,所以每次調用都需要 new XStream()
 * <em>Note, that this only applies if annotations are not auto-detected on-the-fly.</em>
 *
 * Created by brett on 2015/2/4.
 */
public class XStreamUtil {

  /**
   * java對象轉xml
   * @param root
   * @return
   */
  public static String toXml(UMSFX root){
    XStream xstream = new XStream();
    xstream.autodetectAnnotations(true);
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + xstream.toXML(root);
  }


  /**
   * xml 轉 java對象
   * @param xml
   * @return
   */
  public static UMSFX toObject(String xml){
    XStream xstream = new XStream();
    xstream.autodetectAnnotations(true);
    xstream.alias("UMSFX", UMSFX.class);
    return (UMSFX) xstream.fromXML(xml);
  }
  /**
   * xml 轉 java對象
   * @param in InputStream
   * @return
   */
  public static UMSFX toObject(InputStream in){
    XStream xstream = new XStream();
    xstream.autodetectAnnotations(true);
    xstream.alias("UMSFX", UMSFX.class);
    return (UMSFX) xstream.fromXML(in);
  }

}


convert 實現自動識別java類型,並轉換成java value-bean

/**
 * Created by brett on 2015/2/3.
 */
public class RequestConvert implements Converter {

//  public RequestConvert(Mapper mapper) {
//    super(mapper);
//  }

  @Override
  public boolean canConvert(Class type) {
    return type.equals(UMSFX.class);
  }


  /**
   * 輸出
   * <UMSFX xmlns="http://www.chinaums.com/UMSFX/1.0">
   *   <RequestName>A101AcctBalInqRq</RequestName>
   *     <A101AcctBalInqRq>
   *     <MsgHeader>
   *       <Ver>10001</Ver>
   *       <TransCode>201811</TransCode>
   *       <MerId>10001000000030</MerId>
   *       <SrcReqDate>20150203</SrcReqDate>
   *       <SrcReqId>123456754321345</SrcReqId>
   *       <ChannelId>10001000000030</ChannelId>
   *       <RespCode></RespCode>
   *       <RespMsg></RespMsg>
   *     </MsgHeader>
   *     <UserId>Testuserid009890</UserId>
   *     <Reserved></Reserved>
   *   </A101AcctBalInqRq>
   * </UMSFX>
   * @param source
   * @param writer
   * @param context
   */
  @Override
  public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
    UMSFX umsfx = (UMSFX) source;
    writer.addAttribute("xmlns", "http://www.chinaums.com/UMSFX/1.0");

    // add RequestName tag
    writer.startNode("RequestName");
    context.convertAnother(umsfx.getRequestName());
    writer.endNode();

    // add Request tag
    writer.startNode( umsfx.getMsgContent().getClass().getSimpleName() );
    context.convertAnother(umsfx.getMsgContent());
    writer.endNode();
  }

  /**
   * xml to java object
   * @param reader
   * @param context
   * @return
   */
  @Override
  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {

    if( reader.getNodeName().equals("UMSFX") ) {
      UMSFX umsfx = new UMSFX();

//      reader.hasMoreChildren();
      reader.moveDown();
      String requestName = (String) context.convertAnother(reader, String.class);
      umsfx.setRequestName(requestName);

      // moveUp() and moveUp() 類似於 iterator.next()
      reader.moveUp();
//      reader.hasMoreChildren();
      reader.moveDown();
//      Class type = HierarchicalStreams.readClassType(reader, context.getRequiredType());
      try {
        Class type = Class.forName("com.xxx.vo." + reader.getNodeName());// vo都在同一個包下,NodeName名稱即爲Class類名稱
        umsfx.setMsgContent((MsgContent) context.convertAnother(reader, type));

        return umsfx;
      } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
      }
    }

    return null;
  }
}






發佈了36 篇原創文章 · 獲贊 12 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章