우선 AS3에서 제공하는 SharedObject의 deletage를 만든 다음 생성자 없이 getLocal()를 통해
데이터를 만들거나 읽기를 한다.

이후 객체에 데이터를 설정하기 위해서는 SharedObject.data를 통해 이름과 값을 설정한다.
단 getLocal("이름")의 이름과 data에 저장하는 변수의 이름이 같으면 안된다.

[ 공유객체 생성/로드 ]
var so:SharedObject = SharedObject.getLocal("jys");

[ 공유객체의 data를 통해 데이터를 설정 ]
so.data.userName = "jeong youn soo";
so.data.text = "공유객체에 이 내용을 저장한다.";
so.data.ary = ["a" , "b" , "c"];
so.data.date = new Date();
so.data.obj = {key1:"예시" , key2:-20 , key3:null }

위처럼 공유객체에서 지원하는 data라는 속성을 사용하여 데이터를 선언하여야 한다. 선언할 수 있는 데이터 타입은 문자,숫자,Date,오브젝트등 AS3에서 제공하는 대부분의 데이터 타입을 저장 할 수 있으면 심지어 인스턴스 클래스까지 저장 할 수 있다.

단 아래처럼 공유객체에 직접 데이터를 설정하면 에러를 발생한다.
so.text = "이것은 컴파일 에러를 발생한다.";

위에서 처럼 SharedObject에 데이터를 설정하면 자동으로 클라이언트 Pc에 기록된다.
그러나 기본 100kb를 넘어서거나 사용자가 저장 용량을 저장할 데이터 보다 적게 선언하였을 때는
저장 하지를 못한다.
이때 이를 체크할 수 있도록 SharedObjectFlushStatus저장 성공/실패 여부를 반환한다.
이를 체크하기 위해서는 SharedObject의 상태를 확인할 수 있는 flush()라는 메서드를 사용한다.

[ 저장상태를 체크 ]
var flushResult:String = so.flush();
저장이 성공하면 flush()메서드는 "flushed"를 반환하며 저장이 실패하면 "pending"을 넘겨준다.
이들은 SharedObjectFlushStatus에 상수로 설정되어있다.
if( flushResult == SharedObjectFlushStatus.FLUSHED ) {
    저장 성공 액션
}else if( flushResult == SharedObjectFlushStatus.PENDING ){
    저장 실패 액션
}


만약 저장에 실패하였을 경우에는 사용자에게 저장 여부를 확인하여야 한다.
따라서 Security.showSettings( SecurityPanel.LOCAL_STORAGE )try~catch문에 삽입하여
에러가 발생하면 SecurityPanel창을 띄워 저장 공간을 늘리게하거나 저장 허용하도록 한다.
이때 넘어오는 이벤트가 NetStatusEvent이벤트이다.

저장 실패시 이러한 이벤트를 SharedObject에 리스너를 등록하고 사용자가 승인또는 비승인을 체크하여
프로세스를 이어가야 한다.
SecurityPanel에서 승인이 발생하면 SharedObject.Flush.Success를 건네주고
그렇지 않으면 SharedObject.Flush.Failed를 건네준다.





Posted by 버터백통

액션스크립트는 대부분 메모리에 데이터가 저장되어 사용하다가 무비가 종료하면 데이터도 사라지게 된다. 하지만 무비가 종료되더라도 데이터를 남겨 사용하고 싶거나 같은 클라이언트에서 다른 무비들간에 데이터를 공유하고 싶을 때는 SharedObject(공유객체)라는 것을 사용한다.

SharedObject()는 쿠키보다 더 큰 데이터(최고 100kb)를 저장 할 수 있으며 AS3의 데이터 타입을 그대로 저장/사용 할 수 있다. 이 객체를 사용하여 사용자 컴퓨터에 데이터를 저장하게 되면 "sol"이라는 확장자의 바이너리 데이터를 C:\Documents and Settings\Administrator\Application Data\Macromedia\Flash Player\#SharedObjects\[랜덤폴더명]..와 같은 경로에 생성하게 된다.

[ 속성 ]

client : Object

콜백 메서드가 호출되는 객체를 나타냅니다.

data : Object

[read-only] 객체의 data 속성에 할당된 특성 모음입니다. 이러한 특성은 공유 및 저장이 가능합니다.

defaultObjectEncoding : uint

[static] SWF 파일에서 만들어진 모든 로컬 공유 객체에 대한 기본 객체 인코딩(AMF 버전)입니다.

fps : Number

[write-only] 공유 객체에 대한 클라이언트의 변경이 서버로 전송되는 초당 횟수를 지정합니다.

objectEncoding : uint

이 공유 객체의 객체 인코딩(AMF 버전)입니다.

size : uint

[read-only] 공유 객체의 현재 크기(바이트)입니다.

 

 

[ 메서드 ]

clear():void

로컬 공유 객체의 경우, 모든 데이터를 제거하고 디스크에서 공유 객체를 삭제합니다.

close():void

원격 공유 객체와 서버 간의 연결을 종료합니다.

connect(myConnection:NetConnection, params:String = null):void

지정된 연결을 통해 서버의 원격 공유 객체에 연결합니다.

flush(minDiskSpace:int = 0):String

로컬 영구 공유 객체를 로컬 파일에 즉시 기록합니다.

getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject

[static] 현재 클라이언트에만 사용 가능한 로컬 영구 공유 객체에 대한 참조를 반환합니다.

getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject

[static] Flash Media Server와 같은 서버를 이용하여 여러 클라이언트 간에 공유할 수 있는 객체에 대한 참조를 반환합니다.

send(... arguments):void

메시지를 보낸 클라이언트를 포함하여 지정된 원격 공유 객체에 연결된 모든 클라이언트로 메시지를 브로드캐스트합니다.

setDirty(propertyName:String):void

공유 객체의 속성 값(data 속성으로 정의)이 변경되었음을 서버에 알립니다.

setProperty(propertyName:String, value:Object = null):void

공유 객체의 속성 값(data 속성으로 정의)을 업데이트하고 해당 속성의 값이 변경되었음을 서버에 알립니다.

 

 

[ 이벤트 ]

이벤트

요약

asyncError

기본 비동기 코드에서 비동기적으로 예외가 발생할 때 전달됩니다.

netStatus

SharedObject 인스턴스가 상태 또는 오류 상황을 보고할 때 전달됩니다.

sync

서버에서 원격 공유 객체(SharedObject)를 업데이트하면 전달됩니다.

Posted by 버터백통
Tip And Tech2008. 7. 13. 14:27

SharedObject는 사용자 컴퓨터 공유객체에 저장하는 공간을 만들어 쿠키처럼 호출하여 값을 참조할 수 있도록 한다. 공유객체에 참조자를 만들기 위해서는 반드시 getLocal()를 설정해야 한다. 그리고 swf에서 쿠키처럼 사용할 수 있는 공간 100kb밖에 안된다.

예) 오늘본 상품 등록..
생성시...아래의 메서드를 선언해야 한다.
getLocal : 컴퓨터에 저장
getRemote : 서버를 통해 공유(예: 두 pc가 같이 그림을 그릴수 있다...) 특정 서비스 서버가 있어야한다.



[Public 속성]
client : Object
콜백 메서드가 호출되는 객체를 나타냅니다.

data : Object
[read-only] 객체의 data 속성에 할당된 특성 모음입니다. 이러한 특성은 공유 및 저장이 가능합니다.

defaultObjectEncoding : uint
[static] SWF 파일에서 만들어진 모든 로컬 공유 객체에 대한 기본 객체 인코딩(AMF 버전)입니다.

fps : Number
[write-only] 공유 객체에 대한 클라이언트의 변경이 서버로 전송되는 초당 횟수를 지정합니다.

objectEncoding : uint
이 공유 객체의 객체 인코딩(AMF 버전)입니다.

size : uint
[read-only] 공유 객체의 현재 크기(바이트)입니다.

[Public 메서드]
clear():void
로컬 공유 객체의 경우, 모든 데이터를 제거하고 디스크에서 공유 객체를 삭제합니다.

close():void
원격 공유 객체와 서버 간의 연결을 종료합니다.

connect(myConnection:NetConnection, params:String = null):void
지정된 연결을 통해 서버의 원격 공유 객체에 연결합니다.

flush(minDiskSpace:int = 0):String
로컬 영구 공유 객체를 로컬 파일에 즉시 기록합니다.

getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject
[static] 현재 클라이언트에만 사용 가능한 로컬 영구 공유 객체에 대한 참조를 반환합니다.

getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject
[static] Flash Media Server와 같은 서버를 이용하여 여러 클라이언트 간에 공유할 수 있는 객체에 대한 참조를 반환합니다.

send(... arguments):void
메시지를 보낸 클라이언트를 포함하여 지정된 원격 공유 객체에 연결된 모든 클라이언트로 메시지를 브로드캐스트합니다.

setDirty(propertyName:String):void
공유 객체의 속성 값(data 속성으로 정의)이 변경되었음을 서버에 알립니다.

setProperty(propertyName:String, value:Object = null):void
공유 객체의 속성 값(data 속성으로 정의)을 업데이트하고 해당 속성의 값이 변경되었음을 서버에 알립니다.

asyncError
기본 비동기 코드에서 비동기적으로 예외가 발생할 때 전달됩니다.

netStatus
SharedObject 인스턴스가 상태 또는 오류 상황을 보고할 때 전달됩니다.

sync
서버에서 원격 공유 객체(SharedObject)를 업데이트하면 전달됩니다.

아래 코드는 간단히 SharedObject 를 사용하여 방문기록을 표현한 것이다.
private var so: SharedObject = SharedObject.getLocal( "www.xprime.co.kr");

public function SharedObjectTest()
{
   super();
   if( so.data.count == undefined ){
    so.data.count = 1;    
   }else {
    so.data.count ++;
   }
   
   if( so.data.date == undefined ){
    so.data.date = new Date();
   }

   trace( "당신은 "+  so.data.count + " 번 접속했습니다. " , so.data.date.toString()  );
   so.data.date = new Date();
 }


// 출력 : 당신은 3 번 접속했습니다.  Sun Jul 13 14:03:41 GMT+0900 2008

Posted by 버터백통