readObject()
メソッドと
writeObject()
メソッドは、直列化された Action Message Format (AMF)でエンコードされた ByteArray のオブジェクトを読み取ったり、書き込んだりします。AMF はアドビ システムズ社が開発した独自のメッセージプロトコルであり、Netstream、NetConnection、NetStream、LocalConnection、Shared Objects など、様々な ActionScript 3.0 クラスで使用されています。
1 バイト型のマーカーが、その後に続くエンコードされたデータの型を示します。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 という 2 つのバージョンがあります。AMF 0 では複雑なオブジェクトの参照渡しがサポートされ、エンドポイントでオブジェクトの関係を復元することができます。AMF 3 は AMF 0 の改良版であり、オブジェクトの参照に加えてオブジェクトの特性とストリングを渡し、ActionScript 3.0 で導入された新しいデータ型をサポートします。 オブジェクトデータのエンコードに使用する AMF のバージョンは、
ByteArray.objectEcoding
プロパティで指定します。flash.net.ObjectEncoding クラスでは、AMF のバージョンを指定するための定数として、
ObjectEncoding.AMF0
と
ObjectEncoding.AMF3
が定義されています。
次の例では、
writeObject()
を呼び出して XML オブジェクトを ByteArray に書き込んだ後、デスクトップの
order
ファイルに書き込んでいます。この例では、終了時に「Wrote order file to desktop!」というメッセージを AIR ウィンドウに表示します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#taFiles
{
border: 1px solid black;
font-family: Courier, monospace;
white-space: pre;
width: 95%;
height: 95%;
overflow-y: scroll;
}
</style>
<script type="text/javascript" src="AIRAliases.js" ></script>
<script type="text/javascript">
//define ByteArray
var inBytes = new air.ByteArray();
//add objectEncoding value and file heading to output text
var output = "Object encoding is: " + inBytes.objectEncoding + "\n\n" + "order file: \n\n";
function init() {
readFile("order", inBytes);
inBytes.position = 0; //reset position to beginning
// read XML from ByteArray
var orderXML = inBytes.readObject();
// convert to XML Document object
var myXML = (new DOMParser()).parseFromString(orderXML, "text/xml");
document.write(myXML.getElementsByTagName("menuName")[0].childNodes[0].nodeValue + ": ");
document.write(myXML.getElementsByTagName("price")[0].childNodes[0].nodeValue + "<br/>"); // burger: 3.95
document.write(myXML.getElementsByTagName("menuName")[1].childNodes[0].nodeValue + ": ");
document.write(myXML.getElementsByTagName("price")[1].childNodes[0].nodeValue + "<br/>"); // fries: 1.45
} // end of init()
// read specified file into byte array
function readFile(fileName, data) {
var inFile = air.File.desktopDirectory; // source folder is desktop
inFile = inFile.resolvePath(fileName); // name of file to read
var inStream = new air.FileStream();
inStream.open(inFile, air.FileMode.READ);
inStream.readBytes(data, 0, data.length);
inStream.close();
}
</script>
</head>
<body onload = "init();">
<div id="taFiles"></div>
</body>
</html>
readObject()
メソッドは、直列化された AMF のオブジェクトを ByteArray から読み取り、指定された型のオブジェクトに格納します。次の例では、
order
ファイルをデスクトップから ByteArray(
inBytes
)に読み取り、
readObject()
を呼び出して
orderXML
に格納した後、XML オブジェクトドキュメント
myXML
に変換して、2 つのアイテムエレメントと価格エレメントの値を表示しています。また、
objectEncoding
プロパティの値を、
order
ファイルのコンテンツのヘッダーと共に表示しています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#taFiles
{
border: 1px solid black;
font-family: Courier, monospace;
white-space: pre;
width: 95%;
height: 95%;
overflow-y: scroll;
}
</style>
<script type="text/javascript" src="AIRAliases.js" ></script>
<script type="text/javascript">
//define ByteArray
var inBytes = new air.ByteArray();
//add objectEncoding value and file heading to output text
var output = "Object encoding is: " + inBytes.objectEncoding + "<br/><br/>" + "order file items:" + "<br/><br/>";
function init() {
readFile("order", inBytes);
inBytes.position = 0; //reset position to beginning
// read XML from ByteArray
var orderXML = inBytes.readObject();
// convert to XML Document object
var myXML = (new DOMParser()).parseFromString(orderXML, "text/xml");
document.write(output);
document.write(myXML.getElementsByTagName("menuName")[0].childNodes[0].nodeValue + ": ");
document.write(myXML.getElementsByTagName("price")[0].childNodes[0].nodeValue + "<br/>"); // burger: 3.95
document.write(myXML.getElementsByTagName("menuName")[1].childNodes[0].nodeValue + ": ");
document.write(myXML.getElementsByTagName("price")[1].childNodes[0].nodeValue + "<br/>"); // fries: 1.45
} // end of init()
// read specified file into byte array
function readFile(fileName, data) {
var inFile = air.File.desktopDirectory; // source folder is desktop
inFile = inFile.resolvePath(fileName); // name of file to read
var inStream = new air.FileStream();
inStream.open(inFile, air.FileMode.READ);
inStream.readBytes(data, 0, data.length);
inStream.close();
}
</script>
</head>
<body onload = "init();">
<div id="taFiles"></div>
</body>
</html>