走自己的路

          路漫漫其修遠兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評論 :: 0 Trackbacks
           

          XStreamthoughtworks開發的開源產品,采用的是xpp來進行xml和對象之間的轉換。它不需要schema或其他的mapping文件就可以進行java對象和xml文件之間的轉換,API調用起來非常方便,并且擴展功能強大。                

          網址:http://xstream.codehaus.org


          JSON是目前比較流行的輕量級的對象數據轉換方式,常常用在ajaxweb service領域。目前大部分語言都有JSON的實現。Java領域有json lib,還有xstream json(jettison)

          網址:http://json-lib.sourceforge.net/

          http://jettison.codehaus.org


          主要是對
          3 (xstream, json lib, xstream json) 轉換的數據長度,還有轉換的效率做個比較。

          轉換的java類為:

          package com.ldd600.ws;

          public class Employee {
              
          private String name;
              
          private int age;
              
          private Address address;
              
          private double salary;
              
          private boolean isActive;
              
          private char sexy;

              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String naem) {
                  
          this.name = naem;
              }


              
          public int getAge() {
                  
          return age;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public Address getAddress() {
                  
          return address;
              }


              
          public void setAddress(Address address) {
                  
          this.address = address;
              }


              
          public double getSalary() {
                  
          return salary;
              }


              
          public void setSalary(double salary) {
                  
          this.salary = salary;
              }


              
          public boolean isActive() {
                  
          return isActive;
              }


              
          public void setActive(boolean isActive) {
                  
          this.isActive = isActive;
              }


              
          public char getSexy() {
                  
          return sexy;
              }


              
          public void setSexy(char sexy) {
                  
          this.sexy = sexy;
              }


          }


          package com.ldd600.ws;

          public class Address {
              
          private String street;
              
          private String country;
              
          private String city;
              
          private String doorNum;
          //    private Employee employee;
              private String empName;
              
              
          public String getStreet() {
                  
          return street;
              }


              
          public void setStreet(String street) {
                  
          this.street = street;
              }


              
          public String getCountry() {
                  
          return country;
              }


              
          public void setCountry(String country) {
                  
          this.country = country;
              }


              
          public String getCity() {
                  
          return city;
              }


              
          public void setCity(String city) {
                  
          this.city = city;
              }


              
          public String getDoorNum() {
                  
          return doorNum;
              }


              
          public void setDoorNum(String doorNum) {
                  
          this.doorNum = doorNum;
              }


              
          public String getEmpName() {
                  
          return empName;
              }


              
          public void setEmpName(String empName) {
                  
          this.empName = empName;
              }

              
          //    public Employee getEmployee() {
          //        return employee;
          //    }
          //
          //    public void setEmployee(Employee employee) {
          //        this.employee = employee;
          //    }
              
          }

           

          數據格式和長度比較:

          方法

          長度

          格式

          Xstream

          328

          <com.ldd600.ws.Employee>

            <name>gavin</name>

            <age>0</age>

            <address>

              <street>zhaojiabang</street>

              <country>china</country>

              <city>shanghai</city>

              <doorNum>789</doorNum>

              <empName>gavin</empName>

            </address>

            <salary>300000.0</salary>

            <isActive>true</isActive>

            <sexy>m</sexy>

          </com.ldd600.ws.Employee>

          Json lib

          170

          "789","empName":"gavin","street":"zhaojiabang"},"age":0,"name":"gavin","salary":300000,"sexy":"m"}

          XStream json

          183

          {"employee":{"name":"gavin","age":0,"address":{"street":"zhaojiabang","country":"china","city":"shanghai","doorNum":789,"empName":"gavin"},"salary":300000,"isActive":true,"sexy":"m"}}

           

          時間(轉換次數1000000):

          方式

          時間(ms)

          Json lib

          185638

          XStream xml

          247863

          XStream json

          395624

           

          Xstream xml方式比json lib慢:62s

          Xstream json方式比xstream xml慢:147s

           

          如何選擇:

          JSON:

          只是純粹數據轉換的方式,如果不需要命名空間,驗證,XSLTxml的功能,可以考慮使用。但是JSON規范還存在一些不支持的情況,比如當Address類中也有Employee類的引用時,轉換就會拋出異常。要說明的是jettison應該是xmljson之間轉換的工具,xstream利用jettison完成java對象到xml再到json的轉換,這樣性能就更糟糕了。而且xstream json有很多不滿足json規范的地方,比如一個空stringjson規范中會轉成null,而在xstream json中會轉換成””, 所以在使用其他json工具消費xstream json生產的json字符串時就會出現問題。但Json lib提供了JSonConfig類解決了這個問題。如果進行xmljson之間的轉換可以考慮使用jettison

           

          XStream

          采用xml作為數據轉換的方式,這就是xmljson之爭了。可以參考以下資源:

          JSON vs. XML: The Debate

          http://ajaxian.com/archives/json-vs-xml-the-debate

          JSON Web Services - the XML JSON debate further ahead

          http://techtracer.com/2007/04/01/json-web-services-the-xml-json-debate-further-ahead/

          JSON Pros and Cons

          http://myarch.com/json-pros-and-cons

          Debate: JSON vs. XML as a data interchange format

          http://www.infoq.com/news/2006/12/json-vs-xml-debate



          Xstream不需要關心xml schema驗證,它比json好的一個地方是它可以自動處理引用的表達方式,比如多個變量重復引用同一個對象,循環引用等,如;

          <employee reference="../.."/>

          它的API使用太方便了,

          XStream xstream = new XStream();

          String xml = xstream.toXML(employee);

          Employee xsEmployee = (Employee) xstream.fromXML(xml);

          Xstream自定義和擴展功能也很強大,如用戶可以通過converter來實現自己類型的轉換邏輯。

           

          現在我們有個項目需要設計一個通用的web service agent,根據客戶端提供的類名,方法名,參數等調用本地的方法。這樣可能需要一種統一的數據格式和處理方式,考慮傳的參數可能出現互相引用的情況,還有可讀性,將來的擴展性等問題決定默認方式還是使用xstream來轉換。



          posted on 2009-01-20 17:43 叱咤紅人 閱讀(3933) 評論(5)  編輯  收藏 所屬分類: JDBC JNDI JMS RMI EJB and Other J2EE Tech TestXML

          評論

          # re: 對比XStream和JSON 2009-01-21 10:24 sorcerer
          乖乖,這么多人看,沒人評論.我來支持一下.
          thoughtworks如雷貫耳啊...
            回復  更多評論
            

          # re: 對比XStream和JSON 2009-01-21 11:15 楊一
          數據傳輸還是用json
          但是xstream用來解析處理xml看起來不錯,比jaxb簡單  回復  更多評論
            

          # re: 對比XStream和JSON 2009-01-21 15:33 sniperking
          web service傳遞數據還是用XML比較好,通用性強  回復  更多評論
            

          # re: 對比XStream和JSON 2009-01-21 16:06 yefeng
          json_lib性能也不是很好的,還是自己寫一個吧,也不難的,就反射而已  回復  更多評論
            

          # re: 對比XStream和JSON 2009-01-21 16:43 ldd600
          @yefeng
          json lib應該還好,它用了bean utils應該有緩存那些反射的結果。如果用json org的那個估計性能就不行了。  回復  更多評論
            

          主站蜘蛛池模板: 繁昌县| 正安县| 南漳县| 福泉市| 澄江县| 玉林市| 江达县| 唐海县| 报价| 大丰市| 滨州市| 于都县| 盖州市| 呼图壁县| 平利县| 珠海市| 巨野县| 合阳县| 广东省| 巴林左旗| 葵青区| 芒康县| 仪征市| 金昌市| 辽宁省| 即墨市| 宜兰市| 方城县| 瑞丽市| 和龙市| 德格县| 保亭| 鄂伦春自治旗| 西吉县| 巴彦县| 焦作市| 凤阳县| 黑水县| 威海市| 泗洪县| 峡江县|