SharedObject 객체의
data
속성을 사용하여
SharedObject
의 *.sol 파일에 데이터를 추가합니다. 공유 객체에 새 데이터를 추가하려면 다음 구문을 사용합니다.
sharedObject_name.data.variable = value;
다음 예제에서는 SharedObject에
userName
,
itemNumbers
및
adminPrivileges
속성과 해당 값을 추가합니다.
public var currentUserName:String = "Reiner";
public var itemsArray:Array = new Array(101,346,483);
public var currentUserIsAdmin:Boolean = true;
mySO.data.userName = currentUserName;
mySO.data.itemNumbers = itemsArray;
mySO.data.adminPrivileges = currentUserIsAdmin;
data
속성에 값을 할당한 후 SharedObject 파일에 해당 값을 기록하도록 Flash Player에 지시해야 합니다. SharedObject 파일에 값을 기록하도록 Flash Player에 지시하려면 다음과 같이
SharedObject
.
flush()
메서드를 사용합니다.
mySO.flush();
SharedObject.flush()
메서드를 호출하지 않으면 Flash Player가 응용 프로그램이 종료될 때 파일에 값을 기록합니다. 그러나 Flash Player가 저장해야 할 데이터의 크기가 기본 설정을 초과하는 경우 사용 가능한 공간을 늘릴 수 있는 기회가 사용자에게 제공되지 않습니다. 따라서
SharedObject.flush()
를 호출하는 것이 좋습니다.
flush()
메서드를 사용하여 공유 객체를 사용자의 하드 드라이브에 기록하는 경우 다음 예제에서 보듯이 사용자가 Flash Player 설정 관리자(
www.macromedia.com/support/documentation/kr/flashplayer/help/settings_manager07.html
)를 사용하여 명시적으로 로컬 저장을 사용하지 않도록 설정했는지 확인해야 합니다.
var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();
공유 객체에 객체 저장
SharedObject의
data
속성에 Array 또는 String 등의 단순 객체를 저장할 수 있습니다.
다음 예제는 공유 객체와의 상호 작용을 제어하는 메서드를 정의하는 ActionScript 클래스입니다. 이러한 메서드를 사용하면 사용자가 공유 객체에서 객체를 추가하거나 제거할 수 있습니다. 이 클래스는 단순 객체가 포함된 ArrayCollection을 저장합니다.
package {
import mx.collections.ArrayCollection;
import flash.net.SharedObject;
public class LSOHandler {
private var mySO:SharedObject;
private var ac:ArrayCollection;
private var lsoType:String;
// The parameter is "feeds" or "sites".
public function LSOHandler(s:String) {
init(s);
}
private function init(s:String):void {
ac = new ArrayCollection();
lsoType = s;
mySO = SharedObject.getLocal(lsoType);
if (getObjects()) {
ac = getObjects();
}
}
public function getObjects():ArrayCollection {
return mySO.data[lsoType];
}
public function addObject(o:Object):void {
ac.addItem(o);
updateSharedObjects();
}
private function updateSharedObjects():void {
mySO.data[lsoType] = ac;
mySO.flush();
}
}
}
다음 Flex 응용 프로그램은 필요한 각 공유 객체 유형별로 ActionScript 클래스 인스턴스를 만듭니다. 그런 다음 사용자가 블로그나 사이트 URL을 추가 또는 제거할 때 해당 클래스에 대한 메서드를 호출합니다.
<?xml version="1.0"?>
<!-- lsos/BlogAggregator.mxml -->
<mx:Application
xmlns:local="*"
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="initApp()"
backgroundColor="#ffffff"
>
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
import flash.net.SharedObject;
[Bindable]
public var welcomeMessage:String;
[Bindable]
public var localFeeds:ArrayCollection = new ArrayCollection();
[Bindable]
public var localSites:ArrayCollection = new ArrayCollection();
public var lsofeeds:LSOHandler;
public var lsosites:LSOHandler;
private function initApp():void {
lsofeeds = new LSOHandler("feeds");
lsosites = new LSOHandler("sites");
if (lsofeeds.getObjects()) {
localFeeds = lsofeeds.getObjects();
}
if (lsosites.getObjects()) {
localSites = lsosites.getObjects();
}
}
// Adds a new feed to the feeds DataGrid.
private function addFeed():void {
// Construct an object you want to store in the
// LSO. This object can contain any number of fields.
var o:Object = {name:ti1.text, url:ti2.text, date:new Date()};
lsofeeds.addObject(o);
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method.
localFeeds = lsofeeds.getObjects();
// Clear the text fields.
ti1.text = '';
ti2.text = '';
}
// Removes feeds from the feeds DataGrid.
private function removeFeed():void {
// Use a method of ArrayCollection to remove a feed.
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method. You do not need
// to update it manually.
if (myFeedsGrid.selectedIndex > -1) {
localFeeds.removeItemAt(myFeedsGrid.selectedIndex);
}
}
private function addSite():void {
var o:Object = {name:ti3.text, date:new Date()};
lsosites.addObject(o);
localSites = lsosites.getObjects();
ti3.text = '';
}
private function removeSite():void {
if (mySitesGrid.selectedIndex > -1) {
localSites.removeItemAt(mySitesGrid.selectedIndex);
}
}
]]>
</mx:Script>
<mx:Label text="Blog aggregator" fontSize="28"/>
<mx:Panel title="Blogs">
<mx:Form id="blogForm">
<mx:HBox>
<mx:FormItem label="Name:">
<mx:TextInput id="ti1" width="100"/>
</mx:FormItem>
<mx:FormItem label="Location:">
<mx:TextInput id="ti2" width="300"/>
</mx:FormItem>
<mx:Button id="b1" label="Add Feed" click="addFeed()"/>
</mx:HBox>
<mx:FormItem label="Existing Feeds:">
<mx:DataGrid
id="myFeedsGrid"
dataProvider="{localFeeds}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b2" label="Remove Feed" click="removeFeed()"/>
</mx:Form>
</mx:Panel>
<mx:Panel title="Sites">
<mx:Form id="siteForm">
<mx:HBox>
<mx:FormItem label="Site:">
<mx:TextInput id="ti3" width="400"/>
</mx:FormItem>
<mx:Button id="b3" label="Add Site" click="addSite()"/>
</mx:HBox>
<mx:FormItem label="Existing Sites:">
<mx:DataGrid
id="mySitesGrid"
dataProvider="{localSites}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b4" label="Remove Site" click="removeSite()"/>
</mx:Form>
</mx:Panel>
</mx:Application>
공유 객체에 유형이 지정된 객체 저장
공유 객체에 유형이 지정된 ActionScript 인스턴스를 저장할 수 있습니다.
flash.net.registerClassAlias()
메서드를 호출하여 클래스를 등록하면 됩니다. 클래스의 인스턴스를 만들어 공유 객체의 데이터 멤버에 저장한 후 나중에 객체를 읽으면 유형이 지정된 인스턴스를 가져옵니다. 기본적으로 SharedObject의
objectEncoding
속성은 AMF3 인코딩을 지원하며 SharedObject 객체에서 저장된 인스턴스의 압축을 풉니다. 따라서 저장된 인스턴스의 유형은
registerClassAlias()
메서드를 호출할 때 지정한 유형과 동일하게 유지됩니다.