JAXB和XStream比較


轉自:https://www.cnblogs.com/tang9139/p/4825610.html

          http://www.cnblogs.com/wlsblog/p/7452882.html

這兩東東本質上是有差別的,JAXB稱為OX binding工具,XStream應該算序列化工具,但OX binding工具也會marshall和unmarshall,所以包含了序列化這一部分。序列化工具不一定需要提供binding的功能。既然都玩序列化,那就簡單地比較一下它們兩在序列化方面的強弱吧。

JAXB:Toplink JAXB 10133,應該是JAXB 1.1標准 (取消了schema的validation功能)

XStream:1.3.1

數據長度:

類型

長度

內容

XStraem

351

<com.oocl.frm.ws.sample.Employee>

 <name>Liufei</name>

 <age>40</age>

 <address>

    <street>Zhaojiabang</street>

    <country>China</country>

    <city>Shanghai</city>

    <doorNum>789</doorNum>

    <empName>Afka liu</empName>

 </address>

 <salary>20000.0</salary>

 <isActive>false</isActive>

 <sexy>F</sexy>

</com.oocl.frm.ws.sample.Employee>

Toplink JAXB

589(已經去掉了white space)

<?xml version="1.0" encoding="UTF-8"?>

<ns0:employee xsi:schemaLocation="http://www.oocl.com/frm/ws/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://www.oocl.com/frm/ws/jaxb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ns0:name>Liufei</ns0:name><ns0:age>40</ns0:age><ns0:salary>20000.0</ns0:salary><ns0:sexy>F</ns0:sexy><ns0:isActive>false</ns0:isActive><ns0:address><ns0:street>Zhaojiabang</ns0:street><ns0:country>China</ns0:country><ns0:city>Shanghai</ns0:city><ns0:doorNum>789</ns0:doorNum><ns0:empName>Afka liu</ns0:empName></ns0:address></ns0:employee>

時間:序列化和反序列化1000000次。

類型

序列化(ms)

反序列化(ms)

XStraem

90148

135878

Toplink JAXB

34872

56557

結果對比:數據量XStream占優勢,時間性能上Toplink Jaxb占明顯優勢

總結(只從序列化功能角度看)

JAXB: 優點

  • J2EE標准
  • 運行時間比XStream少

缺點

  • 用起來不方便:需要把手動的把business object轉換成schema object,當然也可以直接將schema object作為business object,或者采用反射的方法。
  • 有一定的局限性:需要schema或者annotation
  • 數據量稍大

XStream優點:

  • 用起來方便
  • 不需要schema,拿過來就轉
  • 數據量稍小

缺點:

  • 非標准
  • 時間性能差
  • ------------------------------
  • Java Architecture for XML Binding (JAXB) 是一個業界的標准,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,並能將Java對象樹的內容重新寫到XML實例文檔。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。

    這意味着你不需要處理甚至不需要知道XML編程技巧就能在Java應用程序中利用平台核心XML數據的靈活性。而且,可以充分利用XML的優勢而不用依賴於復雜的XML處理模型如SAX或DOM。JAXB 隱藏了細節並且取消了SAX和DOM中沒用的關系——生成的JAXB類僅描述原始模型中定義的關系。其結果是結合了高度可移植Java代碼和高度可移植的XML數據。其中這些代碼可用來創建靈活、輕便的應用程序和Web服務。     JAXB(java Architecture for XML Binding) 是一個業界的標准,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,並能將Java對象樹的內容重新寫到 XML實例文檔。  Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方jar包 即可做到輕松轉換。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即將轉換的JavaBean中添加annotation注解。

     

    一、重要概念

    • JAXBContext類,是應用的入口,用於管理XML/Java綁定信息。
    • Marshaller接口,將Java對象序列化為XML數據。
    • Unmarshaller接口,將XML數據反序列化為Java對象。
    • @XmlType,將Java類或枚舉類型映射到XML模式類型
    • @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或屬性的序列化。FIELD表示JAXB將自動綁定Java類中的每個非靜態的(static)、非瞬態的(由@XmlTransient標 注)字段到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。
    • @XmlAccessorOrder,控制JAXB 綁定類中屬性和字段的排序。
    • @XmlJavaTypeAdapter,使用定制的適配器(即擴展抽象類XmlAdapter並覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。
    • @XmlElementWrapper ,對於數組或集合(即包含多個元素的成員變量),生成一個包裝該數組或集合的XML元素(稱為包裝器)。
    • @XmlRootElement,將Java類或枚舉類型映射到XML元素。
    • @XmlElement,將Java類的一個屬性映射到與屬性同名的一個XML元素。
    • @XmlAttribute,將Java類的一個屬性映射到與屬性同名的一個XML屬性。

    二、工具類

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  org.apache.poi.ss.formula.functions.T;
     
    import  javax.xml.bind.*;
    import  javax.xml.namespace.QName;
    import  java.io.Reader;
    import  java.io.StringReader;
    import  java.io.StringWriter;
     
    public  class  JAXBUtil {
     
         /**
          * beanToXml
          * @param obj
          * @param encoding
          * @return
          */
         public  static  String toXml(Object obj,String encoding) {
             try  {
                 StringWriter sw =  new  StringWriter();
                 JAXBContext context = JAXBCache.instance().getJAXBContext(obj.getClass());
                 Marshaller marshaller = context.createMarshaller();
                 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                 marshaller.setProperty(Marshaller.JAXB_FRAGMENT,  true ); // 是否省略xm頭聲明信息
                 marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
                 marshaller.marshal(obj, sw);
                 return  sw.toString().replace( "ns2:" , "" ).replace( ":ns2" , "" );
             catch (JAXBException e) {
                 e.printStackTrace();
                 return  e.getMessage();
             }
         }
     
     
         /**
          * xmlToBean
          * @param xml
          * @param c
          * @param <T>
          * @return
          */
         @SuppressWarnings ( "unchecked" )
         public  static  <T> T toBean(String xml, Class<T> c,String encoding) {
             T t =  null ;
             try  {
                 JAXBContext context = JAXBContext.newInstance(c);
                 Unmarshaller unmarshaller = context.createUnmarshaller();
                 t = (T) unmarshaller.unmarshal( new  StringReader(xml));
             catch  (Exception e) {
                 e.printStackTrace();
             }
             return  t;
         }
    }

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  java.util.concurrent.ConcurrentHashMap;
    import  java.util.concurrent.ConcurrentMap;
    import  javax.xml.bind.JAXBContext;
    import  javax.xml.bind.JAXBException;
    public  final  class  JAXBCache {
         private  static  final  JAXBCache instance =  new  JAXBCache();
         private  final  ConcurrentMap<String, JAXBContext> contextCache =  new  ConcurrentHashMap<String, JAXBContext>();
         private  JAXBCache() {
         }
         public  static  JAXBCache instance() {
             return  instance;
         }
         JAXBContext getJAXBContext(Class<?> clazz)  throws  JAXBException {
             JAXBContext context = contextCache.get(clazz.getName());
             if  ( context ==  null  )
             {
                 context = JAXBContext.newInstance(clazz);
                 contextCache.putIfAbsent(clazz.getName(), context);
             }
             return  context;
         }
    }

      

    1
    2
    3
    4
    5
    6
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    public  class  XMLNameSpace {
         public  static  final  String ADMIN_PREFIX =  "" ;
         public  static  final  String ADMIN_URI =  "http://WebServices.WS.JointownTech.com//" ;
    }

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;
    import  com.thoughtworks.xstream.annotations.XStreamAlias;
     
    import  javax.xml.bind.annotation.XmlAccessType;
    import  javax.xml.bind.annotation.XmlAccessorType;
    import  javax.xml.bind.annotation.XmlElement;
    import  javax.xml.bind.annotation.XmlType;
     
    /**
      * Created by wls on 2017/8/15.
      */
    @XmlAccessorType (XmlAccessType.FIELD)
    @XmlType (propOrder= { "result" , "errorDesc" , "elecPrescription" })
    public  class  AddPrescriptionToMes2ItemResponse {
    //    @XStreamAlias("result")
         @XmlElement (name= "result" ,namespace = XMLNameSpace.ADMIN_URI)
         private  String result;
         @XmlElement (required =  false )
         private  String errorDesc;
         @XmlElement (required =  false )
         private  ElecPrescription elecPrescription;
     
         public  String getResult() {
             return  result;
         }
     
         public  void  setResult(String result) {
             this .result = result;
         }
     
         public  String getErrorDesc() {
             return  errorDesc;
         }
     
         public  void  setErrorDesc(String errorDesc) {
             this .errorDesc = errorDesc;
         }
     
         public  ElecPrescription getElecPrescription() {
             return  elecPrescription;
         }
     
         public  void  setElecPrescription(ElecPrescription elecPrescription) {
             this .elecPrescription = elecPrescription;
         }
     
         @Override
         public  String toString() {
             return  "AddPrescriptionToMes2ItemResponse{"  +
                 "result='"  + result + '\ ''  +
                 ", errorDesc='"  + errorDesc + '\ ''  +
                 ", elecPrescription="  + elecPrescription +
                 '}' ;
         }
    }

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  com.thoughtworks.xstream.annotations.XStreamAlias;
     
    import  javax.xml.bind.annotation.*;
    import  javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
     
    /**
      * Created by wls on 2017/8/15.
      */
    //@XStreamAlias("string")
    @XmlRootElement (name =  "string" ,namespace = XMLNameSpace.ADMIN_URI)
    @XmlAccessorType (XmlAccessType.FIELD)
    @XmlType (propOrder= { "response" })
    public  class  AddPrescriptionToMes2Response {
         @XmlElement (name =  "response" ,namespace = XMLNameSpace.ADMIN_URI)
         private  AddPrescriptionToMes2ItemResponse response;
     
         public  AddPrescriptionToMes2ItemResponse getResponse() {
             return  response;
         }
     
         public  void  setResponse(AddPrescriptionToMes2ItemResponse response) {
             this .response = response;
         }
     
         @Override
         public  String toString() {
             return  "AddPrescriptionToMes2Response{"  +
                 "response="  + response +
                 '}' ;
         }
    }

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;
     
    import  javax.xml.bind.annotation.XmlAccessType;
    import  javax.xml.bind.annotation.XmlAccessorType;
    import  javax.xml.bind.annotation.XmlElement;
    import  javax.xml.bind.annotation.XmlType;
     
    /**
      * Created by wls on 2017/8/17.
      */
    @XmlAccessorType (XmlAccessType.FIELD)
    @XmlType (propOrder= { "result" , "errorDesc" },namespace = XMLNameSpace.ADMIN_URI)
    public  class  SetWXPrescriptionInfoItemResponse {
         @XmlElement (name =  "result" ,namespace = XMLNameSpace.ADMIN_URI)
         private  ElecPrescription result;
         private  String errorDesc;
     
     
         public  ElecPrescription getResult() {
             return  result;
         }
     
         public  void  setResult(ElecPrescription result) {
             this .result = result;
         }
     
         public  String getErrorDesc() {
             return  errorDesc;
         }
     
         public  void  setErrorDesc(String errorDesc) {
             this .errorDesc = errorDesc;
         }
     
    }

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util;
     
    import  com.thoughtworks.xstream.annotations.XStreamAlias;
     
    import  javax.xml.bind.annotation.*;
     
    /**
      * Created by wls on 2017/8/17.
      */
    //@XStreamAlias("string")
    @XmlRootElement (name =  "string" ,namespace = XMLNameSpace.ADMIN_URI)
    @XmlAccessorType (XmlAccessType.FIELD)
    @XmlType (propOrder= { "response" })
    public  class  SetWXPrescriptionInfoResponse {
         @XmlElement (name =  "response" ,namespace = XMLNameSpace.ADMIN_URI)
         private  SetWXPrescriptionInfoItemResponse response;
     
         public  SetWXPrescriptionInfoItemResponse getResponse() {
             return  response;
         }
     
         public  void  setResponse(SetWXPrescriptionInfoItemResponse response) {
             this .response = response;
         }
    }

      三、測試類

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package  com.ehaoyao.jobcenter.test;
     
    import  com.alibaba.fastjson.JSONObject;
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.AddPrescriptionToMes2Response;
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.JAXBUtil;
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.Util.SetWXPrescriptionInfoResponse;
    import  com.ehaoyao.jobcenter.order.webservices.jztdzy.model.ElecPrescription;
    import  org.apache.poi.ss.formula.functions.T;
     
    import  static  org.junit.Assert.*;
     
    public  class  JaxbUtilTest {
     
         public  static  void  main(String[] args) {
             ElecPrescription elecPrescription =  new  ElecPrescription();
             elecPrescription.setAddress( "測試地址" );
             elecPrescription.setAge( 12 );
             elecPrescription.setAgentNum( 1 );
             elecPrescription.setBillDates( "2017-08-19 12:02:21" );
             elecPrescription.setBlank2( "1" );
             elecPrescription.setBlank3( "1" );
             elecPrescription.setBusinessId( "1435" );
             String ret = JAXBUtil.toXml(elecPrescription, "UTF-8" );
             System.out.println(ret);
             elecPrescription = (ElecPrescription) JAXBUtil.toBean(ret,ElecPrescription. class , "UTF-8" );
             System.out.println(elecPrescription);
     
             ret =  "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result>1</result></response></string>" ;
             AddPrescriptionToMes2Response addPrescriptionToMes2Response = JAXBUtil.toBean(ret,AddPrescriptionToMes2Response. class , "UTF-8" );
             System.out.println(addPrescriptionToMes2Response!= null ? JSONObject.toJSONString(addPrescriptionToMes2Response): null );
     
             ret =  "<string xmlns=\"http://WebServices.WS.JointownTech.com//\"><response><result><BillDates>2017-08-16</BillDates><OutPrescriptionCode>100004</OutPrescriptionCode><OutPrescriptionSn>1004</OutPrescriptionSn><tpyq>代煎</tpyq><zgyq></zgyq><Patient>張三</Patient><Gender>女</Gender><Age>12</Age><CFDates>2017-08-17</CFDates><IsPregnancy>否</IsPregnancy><cflx>外用</cflx><AgentNum>1</AgentNum><Remark></Remark><Opinion></Opinion><BusinessName>好葯師三方渠道</BusinessName><orgname>湖北公司</orgname><Dosages>1</Dosages><jyyq>1</jyyq><jyfa>微壓(密閉)解表(15min)</jyfa><PatientCode></PatientCode><PictureIP>http://10.2.72.200:131/DCIM/010100003639731150</PictureIP><GoodsDatas><GoodsData><GoodsName>炒蒺藜</GoodsName><Dosage>1</Dosage><GoodsTpyq>無</GoodsTpyq><InvoiceP>0</InvoiceP></GoodsData></GoodsDatas><LogisticsCost>0</LogisticsCost><ProcessingCost>0</ProcessingCost><cfzt>作廢</cfzt><cfjd><CFREVIEWSTAFF></CFREVIEWSTAFF><CFREVIEWTIME></CFREVIEWTIME><MIXSTAFF></MIXSTAFF><MIXREQUESTTIME></MIXREQUESTTIME><MIXSURETIME></MIXSURETIME><MIXREVIEWSTAFF></MIXREVIEWSTAFF><MIXREVIEWTIME></MIXREVIEWTIME><SOAKSTAFF></SOAKSTAFF><SOAKREQUESTTIME></SOAKREQUESTTIME><SOAKSURETIME></SOAKSURETIME><TISANESTAFF></TISANESTAFF><TISANEREQUESTTIME></TISANEREQUESTTIME><TISANESURETIME></TISANESURETIME>  <OINTMENTSTAFF></OINTMENTSTAFF><OINTMENTREQUESTTIME></OINTMENTREQUESTTIME><OINTMENTSURETIME></OINTMENTSURETIME><INNERPACKINGSTAFF></INNERPACKINGSTAFF><INNERPACKINGTIME></INNERPACKINGTIME><OUTERPACKINGSTAFF>zyadmin</OUTERPACKINGSTAFF><OUTERPACKINGTIME>2017-08-16 16:41:56</OUTERPACKINGTIME></cfjd><psjd><LogisticsCompany></LogisticsCompany><ExpressNumber></ExpressNumber></psjd></result></response></string>" ;
             SetWXPrescriptionInfoResponse setWXPrescriptionInfoResponse = JAXBUtil.toBean(ret,SetWXPrescriptionInfoResponse. class , "UTF-8" );
             System.out.println(setWXPrescriptionInfoResponse!= null ? JSONObject.toJSONString(setWXPrescriptionInfoResponse): null );
         }
    }
    }

      

     

      四、運行效果

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM