readObject()
및
writeObject()
메서드는 직렬화된 AMF(Action Message Format)로 인코딩된 ByteArray에 대해 객체 읽기/쓰기 작업을 수행합니다. AMF는 Adobe에서 만들어 Netstream, NetConnection, NetStream, LocalConnection 및 공유 객체를 비롯한 다양한 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의 두 가지 버전이 있습니다. AMF0은 참조를 통한 복잡한 객체 전송 작업을 지원하며 끝점에서의 객체 관계 복원을 허용합니다. AMF3은 참조를 통해 객체 참조 외에 객체 특징 및 문자열을 보내고 ActionScript 3.0에서 도입된 새로운 데이터 유형을 지원하여 AMF0을 개선합니다.
ByteArray.objectEcoding
속성은 객체 데이터를 인코딩하는 데 사용되는 AMF의 버전을 지정합니다. flash.net.ObjectEncoding 클래스는 AMF 버전을 지정하는 상수인
ObjectEncoding.AMF0
및
ObjectEncoding.AMF3
을 정의합니다.
다음 예제에서는
writeObject()
를 호출하여 ByteArray에 XML 객체를 쓴 다음 Deflate 알고리즘을 사용하여 ByteArray를 압축하고 데스크톱의
order
파일에 씁니다. 이 예제에서는 작업 완료 시 레이블을 사용하여 "Wrote order file to desktop!"이라는 메시지를 AIR 윈도우에 표시합니다.
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()
메서드는 직렬화된 AMF의 객체를 ByteArray에서 읽어 지정된 유형의 객체에 저장합니다. 다음 예제에서는
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();
}
}