readObject()
方法會從 ByteArray 讀取以 Action Message Format (AMF) 序列化格式進行編碼的物件,而
writeObject()
方法則可寫入此一編碼格式的物件。AMF 是由 Adobe 建立並已取得專利的訊息通訊協定,廣為各種 ActionScript 3.0 類別所採用,包括 Netstream、NetConnection、NetStream、LocalConnection 和共享物件。
單一位元組的類型標記描述了接續在其後的編碼資料類型。AMF 使用下列 13 種資料類型:
value-type = undefined-marker | null-marker | false-marker | true-marker | integer-type |
double-type | string-type | xml-doc-type | date-type | array-type | object-type |
xml-type | byte-array-type
編碼資料始終會接續在類型標記之後,除非標記代表單一可能值如 null、true 或 false,此時只有標記會進行編碼。
AMF 有兩個版本:AMF0 和 AMF3。AMF 0 支援以傳址方式傳送複雜的物件,而且允許端點還原物件關係。AMF 3 不但傳送物件參考,更以傳址方式傳送物件特性和字串,並支援 ActionScript 3.0 新引進的資料類型,藉此改良 AMF 0。
ByteArray.objectEcoding
屬性會指定物件資料進行編碼所用的 AMF 版本。flash.net.ObjectEncoding 類別定義了可供您指定 AMF 版本的常數:
ObjectEncoding.AMF0
和
ObjectEncoding.AMF3
。
下列範例會呼叫
writeObject()
將 XML 物件寫入 ByteArray,接著使用 Deflate 演算法予以壓縮後寫入位於桌面的
order
檔案。此範例會在 AIR 視窗中利用標籤,於作業完成時顯示「Wrote order file to desktop!」訊息。
import flash.filesystem.*;
import flash.display.Sprite;
import flash.display.TextField;
import flash.utils.ByteArray;
public class WriteObjectExample extends Sprite
{
public function WriteObjectExample()
{
var bytes:ByteArray = new ByteArray();
var myLabel:TextField = new TextField();
myLabel.x = 150;
myLabel.y = 150;
myLabel.width = 200;
addChild(myLabel);
var myXML:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
// Write XML object to ByteArray
bytes.writeObject(myXML);
bytes.position = 0; //reset position to beginning
bytes.compress(CompressionAlgorithm.DEFLATE); // compress ByteArray
writeBytesToFile("order.xml", bytes);
myLabel.text = "Wrote order file to desktop!";
}
private function writeBytesToFile(fileName:String, data:ByteArray):void
{
var outFile:File = File.desktopDirectory; // dest folder is desktop
outFile = outFile.resolvePath(fileName); // name of file to write
var outStream:FileStream = new FileStream();
// open output file stream in WRITE mode
outStream.open(outFile, FileMode.WRITE);
// write out the file
outStream.writeBytes(data, 0, data.length);
// close it
outStream.close();
}
}
readObject()
方法會從 ByteArray 讀取 AMF 序列化格式的物件,然後儲存成指定類型的物件。下列範例會先將桌面上的
order
檔案讀入 ByteArray (
inBytes
) 並予以解壓縮,然後呼叫
readObject()
將之儲存成 XML 物件
orderXML
。此範例會使用
for each()
迴圈建構,將每個節點加入至文字區域以供顯示。另外,還會顯示
objectEncoding
屬性的值,以及
order
檔案的內容標題。
import flash.filesystem.*;
import flash.display.Sprite;
import flash.display.TextField;
import flash.utils.ByteArray;
public class ReadObjectExample extends Sprite
{
public function ReadObjectExample()
{
var inBytes:ByteArray = new ByteArray();
// define text area for displaying XML content
var myTxt:TextField = new TextField();
myTxt.width = 550;
myTxt.height = 400;
addChild(myTxt);
//display objectEncoding and file heading
myTxt.text = "Object encoding is: " + inBytes.objectEncoding + "\n\n" + "order file: \n\n";
readFileIntoByteArray("order", inBytes);
inBytes.position = 0; // reset position to beginning
inBytes.uncompress(CompressionAlgorithm.DEFLATE);
inBytes.position = 0; //reset position to beginning
// read XML Object
var orderXML:XML = inBytes.readObject();
// for each node in orderXML
for each (var child:XML in orderXML)
{
// append child node to text area
myTxt.text += child + "\n";
}
}
// read specified file into byte array
private function readFileIntoByteArray(fileName:String, data:ByteArray):void
{
var inFile:File = File.desktopDirectory; // source folder is desktop
inFile = inFile.resolvePath(fileName); // name of file to read
var inStream:FileStream = new FileStream();
inStream.open(inFile, FileMode.READ);
inStream.readBytes(data);
inStream.close();
}
}