ASP.NET 기반의 플래시 객체 직렬화 ASP.NET

액션스크립트 상의 객체를 ASP.NET 페이지에 저장해 보자.

먼저 저장을 수행할 액션스크립트 상의 코드는 다음과 같다.

private function serialize():void{

    //직렬화에 필요한 클래스를 등록한다.
    registerClassAlias("org.manalith.MyClass",MyClass);
   
    //저장을 수행할 ASP.NET 페이지의 URL을 지정한다.
    var url:String = "http://localhost:56746/SaveClass.ashx";

    //직렬화 할 객체 생성
    var MY_OBJECT:MyClass = new MyClass();
   
    var arr:ByteArray = new ByteArray();
    arr.writeObject(MY_OBJECT);
   
    arr.position = 0;
    arr.compress();
   
    var req:URLRequest = new URLRequest(url);
    req.method = URLRequestMethod.POST;
    req.data = arr;
   
    var loader:URLLoader = new URLLoader();
    loader.dataFormat = URLLoaderDataFormat.BINARY;
    loader.load(req);
}

저장을 수행할 ASP.NET 페이지(SaveClass.ashx) 코드는 다음과 같다.

public class SavePage : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        byte[] b = context.Request.BinaryRead(context.Request.TotalBytes);

        string path = context.Server.MapPath("Upload/savedClass.dat");

        //기존에 같은 이름의 파일이 있으면 지운다.
        if (File.Exists(path))
        {
            File.Delete(path);
        }
        using (FileStream fs = File.Create(path))
        {
            for (int i = 0; i < b.Length; i++)
            {
                fs.WriteByte(b[i]);
            }
        }

        context.Response.ContentType = "text/plain";
        context.Response.Write("저장이 완료되었습니다.");
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}

실행해서 myClass.dat 파일로 저장된 내용을 확인해 보자. 잘 저장이 되었으면 이제 불러오기를 할 차례다.

먼저 데이터를 불러 오는 ASP.NET 페이지(LoadClass.ashx)는 다음과 같다.

public class LoadPage : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string path = context.Server.MapPath("Upload/savedClass.dat");

        if (File.Exists(path))
        {
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + "savedClass.dat");
            context.Response.ContentType = "application/octet-stream";
            context.Response.WriteFile(path);
        }
        else
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("해당되는 데이터가 없습니다.");
        }

    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}

액션 스크립트의 다음과 같은 코드로 불러온다.

private function deserialize():void{
    //역직렬화 시에도 클래스 등록이 필요하다.
    registerClassAlias("org.manalith.MyClass",MyClass);
   
    //불러오는 페이지의 뒤에는 매번 새로운 내용을 가져오기 위해 임의의 파라미터를 붙인다.
    var url:String = "http://localhost:56746/LoadClass.ashx?uniq=" + new Date().getTime(), deserialize_complete);
   
    var req:URLRequest = new URLRequest(url);
   
    var loader:URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE, completeHandler);
    loader.dataFormat = URLLoaderDataFormat.BINARY;
    loader.load(req);
}

private function complateHandler(evt:Event):void{
    var arr:ByteArray = URLLoader(evt.target).data as ByteArray;
    if(arr != null){
        arr.uncompress();
        var MY_OBJECT:MyClass = arr.readObject() as MyClass;
        Alert.show(MY_OBJECT.myId);
    }
}

이 글은 아래 문서의 도움을 받았다. 원문이 PHP 기반이라 굳이 ASP.NET으로 만들었다.

Tag :
, , , , , , , ,

Leave Comments