后端也存在java user object類,利用xstream組件把list中的user對象序列化成xml數(shù)據(jù)。在flex端通過httpservice使用E4X format格式獲取。 剛開始自己準備通過e4x技術(shù)來解析xml,構(gòu)造flex user object,類似這樣的處理方式:
復(fù)制代碼 代碼如下:
public function fromXML(currentNode:XML):void{ userID = new Number(currentNode.userID); userName = currentNode.userName; ...... }
不過這種方式太過于繁瑣。于是想自己利用flex reflect來實現(xiàn)一個通用的convert或者說類似xstream這樣的組件。 當然,首先是去google一把,還真找到兩個,一個是XMLConverter (http://www.customware.net/repository/display/FLEX/Integrating+Flex+with+XML+using+XMLConverter),一個就是完全兼容xtream的 asx3m (http://code.google.com/p/asx3m/)。 XMLConverter簡單,不過不是開源的,對于解析單個對象的xml格式,還是夠的,但是對于解析復(fù)雜的包含list結(jié)構(gòu)的,就愛莫能助了。最終還是采用了asx3m,很方便。―― 唯一不爽的就是,asx3m竟然需要依賴VEGAS(http://vegas.googlecode.com/svn/AS3/trunk/src/vegas/)這個龐然大物(其實其只需要hashmap, list等幾個輔助類) 使用asx3m確實很方便,兩端代碼也很簡易,如下: 服務(wù)器端的java代碼: List<WorkItem> users = um.queryUsers(1); XStream xstream = new XStream(); xstream.alias("User", User.class); String xml = xstream.toXML(users); List<WorkItem> users = um.queryUsers(1); XStream xstream = new XStream(); xstream.alias("User", User.class); String xml = xstream.toXML(users); Flex端的as代碼: import hr.binaria.asx3m.Asx3m; import hr.binaria.asx3m.Asx3mer; var xmlc:Asx3mer = Asx3mer.instance; xmlc.xstream.alias("User", User); //這個array中就是user對象列表 var array:ArrayCollection = xmlc.fromXML( compXML ) as ArrayCollection; import hr.binaria.asx3m.Asx3m; import hr.binaria.asx3m.Asx3mer; var xmlc:Asx3mer = Asx3mer.instance; xmlc.xstream.alias("User", User); //這個array中就是user對象列表 var array:ArrayCollection = xmlc.fromXML( compXML ) as ArrayCollection; 就這么簡單。―― 當然,這種方式,需要在兩端維護兩套對象結(jié)構(gòu)(java object)和(as object),但其擴展性和靈活度要比那種AMF的remoteobject的方式高很多。