走自己的路

          路漫漫其修遠(yuǎn)兮,吾將上下而求索

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評(píng)論 :: 0 Trackbacks
           

          XStreamthoughtworks開(kāi)發(fā)的開(kāi)源產(chǎn)品,采用的是xpp來(lái)進(jìn)行xml和對(duì)象之間的轉(zhuǎn)換。它不需要schema或其他的mapping文件就可以進(jìn)行java對(duì)象和xml文件之間的轉(zhuǎn)換,API調(diào)用起來(lái)非常方便,并且擴(kuò)展功能強(qiáng)大。                

          網(wǎng)址:http://xstream.codehaus.org


          JSON是目前比較流行的輕量級(jí)的對(duì)象數(shù)據(jù)轉(zhuǎn)換方式,常常用在ajaxweb service領(lǐng)域。目前大部分語(yǔ)言都有JSON的實(shí)現(xiàn)。Java領(lǐng)域有json lib,還有xstream json(jettison)

          網(wǎng)址:http://json-lib.sourceforge.net/

          http://jettison.codehaus.org


          主要是對(duì)
          3 (xstream, json lib, xstream json) 轉(zhuǎn)換的數(shù)據(jù)長(zhǎng)度,還有轉(zhuǎn)換的效率做個(gè)比較。

          轉(zhuǎn)換的java類(lèi)為:

          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;
          //    }
              
          }

           

          數(shù)據(jù)格式和長(zhǎng)度比較:

          方法

          長(zhǎng)度

          格式

          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"}}

           

          時(shí)間(轉(zhuǎn)換次數(shù)1000000):

          方式

          時(shí)間(ms)

          Json lib

          185638

          XStream xml

          247863

          XStream json

          395624

           

          Xstream xml方式比json lib慢:62s

          Xstream json方式比xstream xml慢:147s

           

          如何選擇:

          JSON:

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

           

          XStream

          采用xml作為數(shù)據(jù)轉(zhuǎn)換的方式,這就是xmljson之爭(zhēng)了。可以參考以下資源:

          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不需要關(guān)心xml schema驗(yàn)證,它比json好的一個(gè)地方是它可以自動(dòng)處理引用的表達(dá)方式,比如多個(gè)變量重復(fù)引用同一個(gè)對(duì)象,循環(huán)引用等,如;

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

          它的API使用太方便了,

          XStream xstream = new XStream();

          String xml = xstream.toXML(employee);

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

          Xstream自定義和擴(kuò)展功能也很強(qiáng)大,如用戶(hù)可以通過(guò)converter來(lái)實(shí)現(xiàn)自己類(lèi)型的轉(zhuǎn)換邏輯。

           

          現(xiàn)在我們有個(gè)項(xiàng)目需要設(shè)計(jì)一個(gè)通用的web service agent,根據(jù)客戶(hù)端提供的類(lèi)名,方法名,參數(shù)等調(diào)用本地的方法。這樣可能需要一種統(tǒng)一的數(shù)據(jù)格式和處理方式,考慮傳的參數(shù)可能出現(xiàn)互相引用的情況,還有可讀性,將來(lái)的擴(kuò)展性等問(wèn)題決定默認(rèn)方式還是使用xstream來(lái)轉(zhuǎn)換。



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

          評(píng)論

          # re: 對(duì)比XStream和JSON 2009-01-21 10:24 sorcerer
          乖乖,這么多人看,沒(méi)人評(píng)論.我來(lái)支持一下.
          thoughtworks如雷貫耳啊...
            回復(fù)  更多評(píng)論
            

          # re: 對(duì)比XStream和JSON 2009-01-21 11:15 楊一
          數(shù)據(jù)傳輸還是用json
          但是xstream用來(lái)解析處理xml看起來(lái)不錯(cuò),比jaxb簡(jiǎn)單  回復(fù)  更多評(píng)論
            

          # re: 對(duì)比XStream和JSON 2009-01-21 15:33 sniperking
          web service傳遞數(shù)據(jù)還是用XML比較好,通用性強(qiáng)  回復(fù)  更多評(píng)論
            

          # re: 對(duì)比XStream和JSON 2009-01-21 16:06 yefeng
          json_lib性能也不是很好的,還是自己寫(xiě)一個(gè)吧,也不難的,就反射而已  回復(fù)  更多評(píng)論
            

          # re: 對(duì)比XStream和JSON 2009-01-21 16:43 ldd600
          @yefeng
          json lib應(yīng)該還好,它用了bean utils應(yīng)該有緩存那些反射的結(jié)果。如果用json org的那個(gè)估計(jì)性能就不行了。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 芜湖县| 晴隆县| 万源市| 鄢陵县| 沙雅县| 隆子县| 西林县| 厦门市| 东兴市| 黔南| 元氏县| 荃湾区| 岳西县| 孝感市| 马边| 嵩明县| 清丰县| 淄博市| 砀山县| 麟游县| 青岛市| 普兰店市| 玛曲县| 炎陵县| 漠河县| 得荣县| 公主岭市| 新竹市| 晋江市| 屯门区| 河源市| 清水河县| 永州市| 遵义市| 莱芜市| 奎屯市| 巢湖市| 枞阳县| 丹凤县| 华宁县| 游戏|