如果你的應該程序必須在運行期間加載一個外部大且冗長的XML文件時,這個方案可能是有用的,通過將XML保存為二進制,你可以壓縮數據得到一個較小的文件,當然,你可以得到的壓縮的數量取決於數據的復雜性,但它通常超過50%(保守估計)。 無可否認的,經壓縮的二進制格式的XML數據違背了擺在首位采用XML的初衷——數據可讀性。因此,在程序進行前你將必須先決擇哪一種更為重要。也許真實的外部數據才是你想要的——允許數據被具體化,可以改變數據而無需重新編譯SWF,然而,或許你更喜歡數據不可編輯。 將XML轉換為二進制數據(ByteArray) 首先,我們看看XML數據如何存儲在ByteArray中。下面的代碼假定您已經有名為“xmlData”字符串值變量存儲XML數據:
- var data:ByteArray = new ByteArray();
- data.writeUTFBytes(xmlData); // xmlData is original XML string
- data.compress();
保存文件 現在,您已經有二進制數據ByteArray對象,可以將該對象作為原始數據保存為文件。你可以以下任意一種方式實現。 (一)發送到服務器腳本; (二)用AIR API保存到本地存儲;或 (三)使用Flash Player 10 API保存到本地存儲。 我 們會用(三),因為是這是每一個Flash開發人員最容易的方案。這個類將會使用flash.net.FileReference。FileReference.save()方法只有在Flash Player 10時才可用。它允許你保存FileReference對象中的數據至本地。
- function on_buttonClick(evt:MouseEvent):void
- {
- var data:ByteArray = new ByteArray();
- data.writeUTFBytes(xmlData); // xmlData is original XML string
- data.compress();
- new FileReference().save(data, "bindata.xml"); // default name "bindata.xml"
- }
save()方法將打一個本地對話框——輸入文件名選擇存放位置后將會把XML數據存儲至本地。注意保存的文件須以“.xml”作為后綴,但是該文件不是可讀地——用文本編輯器打開該文件你看到的是些垃圾數據。 加載二進制XML 加載二進制文件同正常的文本XML文件加載方式一樣:
- var ldr:URLLoader = new URLLoader();
- ldr.dataFormat = URLLoaderDataFormat.BINARY; // ** make sure you do this **
- ldr.addEventListener(Event.COMPLETE, on_XML);
- ldr.addEventListener(IOErrorEvent.IO_ERROR, on_XML);
- ldr.load(new URLRequest(pathToXMLFile));
復制代碼
因此,代碼同正常的文本XML文件加載方式一樣,除了需要將dataFormat設置為URLLoaderDataFormat.BINARY。即使你加載一個普通的文本XML文件,上面的代碼也會工作得很好。 將二進制數據轉換為XML 二進制XML文件加載成功后,將二進制數據轉換為文本XML。
- var xmlData:XML;
- function on_XML(evt:Event):void
- {
- if (evt.type == Event.COMPLETE)
- {
- var data:* = URLLoader(evt.target).data;
- if (data is ByteArray)
- {
- try
- {
- ByteArray(data).uncompress();
- }
- catch(e:Error)
- {
- }
- }
- xmlData = XML(data);
- }
- }
上面的代碼,你的應用程序將能夠同時處理文本XML和二進制XML文件。因此,此代碼你仍可以使用,即使您目前沒有使用XML存儲為壓縮的二進制數據。如果在以后您決定將XML采用二進制壓縮格式,該應用程序也能很好的處理。 |