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 中,随后使用 Deflate 算法压缩 ByteArray 并将其写入桌面上的
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();
}
}