Metody
readObject()
i
writeObject()
odczytują obiekt i zapisują go do obiektu ByteArray zakodowanego w serializowanym formacie AMF (Action Message Format). Format AMF to protokół z informacjami na temat praw własności utworzony przez Adobe i stosowany przez różne klasy ActionScript 3.0, w tym Netstream, NetConnection, NetStream, LocalConnection oraz Shared Objects.
Znacznik jednobajtowy opisuje typ zakodowanych danych występujących po nim. Format AMF korzysta z następujących 13 typów danych:
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
Zakodowane dane występują po typie znacznika, chyba że znacznik przedstawia pojedynczą dopuszczalną wartość, np. null lub true bądź false. W takim wypadku nie są kodowane żadne inne dane.
Istnieją dwie wersje formatu AMF: AMF0 i AMF3. AMF 0 obsługuje wysyłanie złożonych obiektów poprzez odniesienie i umożliwia punktom końcowym przywrócenie relacji pomiędzy obiektami. AMF 3 uzupełnia AMF 0 poprzez przesłanie cech i ciągów jako odniesienie oprócz odniesienia do obiektów oraz poprzez obsługę nowych typów danych wprowadzonych w ActionScript 3.0. Właściwość
ByteArray.objectEcoding
określa wersję pliku AMF użytego w celu zakodowania danych obiektu. Klasa flash.net.ObjectEncoding określa stałe w celu określenia wersji AMF:
ObjectEncoding.AMF0
i
ObjectEncoding.AMF3
.
W następującym przykładzie wywołana jest metoda
writeObject()
w celu zapisania obiektu XML do obiektu ByteArray, który zostaje następnie skompresowany za pomocą algorytmu Deflate i zapisany do pliku
order
na pulpicie. W przykładzie wykorzystana jest etykieta w celu wyświetlenia komunikatu „Wrote order file to desktop!” w oknie AIR po zakończeniu czynności.
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();
}
}
Metoda
readObject()
odczytuje obiekt w serializowanym formacie AMF z obiektu ByteArray i zapisuje go w obiekcie określonego typu. W następującym przykładzie odczytany jest plik
order
z pulpitu do obiektu ByteArray (
inBytes
), cofnięta zostanie kompresja i wywołana metoda
readObject()
w celu zapisania pliku w obiekcie XML
orderXML
. W tym przykładzie wykorzystana jest pętla
for each()
w celu dodania każdego węzła do obszaru tekstowego do wyświetlenia. W tym przykładzie wyświetlana jest również wartość właściwości
objectEncoding
razem z nagłówkiem zawartości pliku
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();
}
}