readObject()
和
writeObject()
方法可从 ByteArray 中读取并向其写入以序列化 Action Message Format (AMF) 格式编码的对象。AMF 是 Adobe 创建并由各种 ActionScript 3.0 类使用的专有消息协议,这些类包括 Netstream、NetConnection、NetStream、LocalConnection 和 SharedObject。
单字节类型标记说明了编码数据遵循的类型。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 通过以下方式对 AMF 0 进行了改进:通过引用发送对象 traits 和字符串,除对象引用外,还支持 ActionScript 3.0 中引入的新的数据类型。
ByteArray.objectEcoding
属性指定了用于对对象数据进行编码的 AMF 版本。flash.net.ObjectEncoding 类定义了用于指定 AMF 版本的常量:
ObjectEncoding.AMF0
和
ObjectEncoding.AMF3
。
以下示例调用
writeObject()
将 XML 对象写入 ByteArray 中,随后将该 ByteArray 写入桌面上的
order
文件中。该示例在完成时将在 AIR 窗口中显示消息“Wrote order file to desktop!”
<!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()
方法从 ByteArray 中读取序列化 AMF 格式的对象并将其存储到指定类型的对象中。以下示例将桌面中的
order
文件读入 ByteArray (
inBytes
) 中并调用
readObject()
以将其存储在
orderXML
中,然后将其转换为 XML 对象文档
myXML
,并显示两个项和价格元素的值。该示例还显示了
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>