본문 바로가기

TechLog

Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기

Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기

닷 넷에서 XML을 사용하고 계십니까? 그럼 Serializer는요? Serializer를 사용하면 XML 문서를 개체로 취급함으로써 문서 내용을 파싱하는 수고를 덜 수 있습니다. 지난 시간에 이어서 이번에는 XML 파싱 부분을 Serializer로 대체하는 코드를 보여드리겠습니다.

 

 

안녕하세요 : )

 

Flash & Asp.net - 2 : Flash 개체와 XML 데이터 연동하기에 이어서, 이번 아티클은 XMLSerializer를 사용해서 XML 문서를 좀 더 쉽게 다루는 방법을 설명합니다.

 

이전 예제를 만들어 보셨다면, 이번 아티클에서 나오는 예제는 aspx 페이지 쪽만 보시면 됩니다. Flash 개체는 단지 참조하는 주소만 바꿔주면 되거든요.

 

이 예제들은 VS.net 2003 Flash MX 2004를 기준으로 작성되었습니다.

 

그럼 시작합니다 : )

 

 

Serialization, 직렬화

 

이 아티클의 목적은 직렬화를 설명하는 것이 아니므로, 간략하게 기술한다면 다음과 같다 : Serialization은 인스턴스(개체)의 상태를 저장하는 프로세스이다. 단순히 '자신이 사용하던 개체의 상태를 저장해 놓고, 필요할 때에 다시 불러올 수 있다' 정도로만 이해하면 되겠다.

 

그런데 이런 개념이, XML에 어떻게 적용될 수 있는가? 설명보다는 감이 오는 예제 코드로 설명하도록 하겠다. 지난 아티클에서 나온 XML 요청 문서의 내용을 보자 :

 

 

 

 

<CalculatorMessage Type="RequestAdd">
    <number>1</number>
    <number>3</number>
    <number>4</number>
</CalculatorMessage>

 

 

 

 

이것을 클래스로는 다음과 같이 표현할 수 있을 것이다 :

 

public class CalculatorMessage

{

    public string Type;

    public int[] number;

};

...

CalculatorMessage msg = new CalculatorMessage();

msg.Type = "RequestAdd";

msg.number = new int[3] {1,2,3};

 

Serialization 이 뭘 얘기하는 것인지 잘 이해가 가지 않는다고 해도, 이렇게 XML 문서(=저장된 코드) -> 개체로의 변환을 수행해주는 프로세스라고 이해하면 된다. 참고로 개체 -> 저장소의 프로세스는 Serialization이라고 하고, 저장소 -> 개체의 프로세스는 Deserialization이라고 한다.

 

 

System.Xml.Serialization 네임스페이스

 

닷넷에서는 XML의 직렬화(지금부터 되도록이면 Serialization 대신 직렬화라는 용어를 사용하겠다) System.Xml.Serialization 네임스페이스를 통해서 지원하고 있다.

 

그 중 실제로 직렬화를 수행하는 클래스는 XmlSerializer가 있으며, 이와 같이 사용한다 :

 

XmlSerializer serializer = new XmlSerializer(typeof(클래스이름));

 

위와 같이 serializer 개체를 생성하면, serializer를 사용해 '클래스이름'에 해당하는 클래스를 직렬화할 수 있다.

 

 

실제 코드

 

그렇다면 실제 코드를 보도록 하자. 이 코드는 지난 아티클과 똑같은 작업을 수행하는 코드를 XmlSerializer를 사용해서 구현한 것이다 :

 

// 메시지 클래스의 선언

public class CalculatorMessage

{

    [System.Xml.Serialization.XmlAttribute]

    public string Type;

    [System.Xml.Serialization.XmlElement]

    public int[] number;

    [System.Xml.Serialization.XmlElement]

    public string OriginalMessage;

};

...

private void Page_Load(object sender, System.EventArgs e)

{

    Response.Expires=0;

    

    XmlSerializer serializer = new XmlSerializer(typeof(CalculatorMessage));

    StringReader rd = new StringReader(Server.UrlDecode(Request.Form.ToString()));

    bool bWrongXMLMessage = false;

    CalculatorMessage msg_recv = null;

    

    msg_recv = (CalculatorMessage)serializer.Deserialize(rd);

 

    CalculatorMessage msg_send = new CalculatorMessage();

    if(msg_recv==null)

    {

        bWrongXMLMessage = true;

    }

    else

    {

        switch(msg_recv.Type)

        {

            case "RequestAdd":

                msg_send.Type = "ResponseAdd";

                int sum = 0;

                for(int i=0;i<msg_recv.number.GetLength(0);i++)

                    sum += msg_recv.number[i];

                msg_send.number = new int[1];

                msg_send.number[0] = sum;

 

                break;

            case "RequestSubtract":

                msg_send.Type = "ResponseSubtract";

                int minuend = msg_recv.number[0];

                

                for(int i=1;i<msg_recv.number.GetLength(0);i++)

                    minuend -= msg_recv.number[i];

                msg_send.number = new int[1];

                msg_send.number[0] = minuend;

                break;

            default:

                bWrongXMLMessage = true;

                break;

        }

    }

    if(bWrongXMLMessage)

    {

        msg_send.Type = "ResponseError";

        msg_send.OriginalMessage = Server.UrlDecode(Request.Form.ToString());

    }

 

    serializer.Serialize(Response.OutputStream, msg_send);

    Response.End();

}

 

예전 코드 내용과 비교해보자면, 클래스 선언 부분 때문에 약간 코드가 길어지기는 했지만 파싱 및 메시지를 해석하는 부분이 매우 간단해졌음을 알 수 있다. 일단 소스 중 중요한 구문을 몇군데 보도록 하겠다.

 

msg_recv = (CalculatorMessage)serializer.Deserialize(rd);

 

serializer.Serialize(Response.OutputStream, msg_send);

 

실 질적으로 위 두 구문이 가장 중요한 부분이다. 위 구문은 StringReader의 개체인 rd를 통해 들어온 요청 XML 문서를 Deserialize해서 CalculatorMessage 개체를 생성하고, 아래 구문은 응답용 CalculatorMessage 개체를 생성해서 Serialize() 메서드를 통해 응답 XML 문서를 생성한다.

 

그리고 메시지 클래스의 선언을 보면 각 멤버 변수에 Attribute를 지정하는 문장이 있다 :

 

[System.Xml.Serialization.XmlAttribute]

[System.Xml.Serialization.XmlElement]

 

각각 멤버 변수가 XML 문서에서 엘리먼트의 속성으로 보여질 것인지, 혹은 엘리먼트로 보여질 것인지를 지정하는 속성이다. XML 문서의 형식을 다시 확인해보면 알 수 있을 것이다.

 

위와 같이 코드를 수정하고, Flash 무비는 예전과 똑같은 코드를 갖고 있되, sendXML.sendAndLoad() 메서드에서 url만 지금 예제 페이지를 가리키도록 수정해주면 된다.

 

결과는 다음과 같다 :

 

   

    '더하기' 버튼 클릭

 

   

    '낯선메시지' 버튼 클릭

 

   

    '빼기' 버튼 클릭

 

Serializer에서 XML 문서를 자동으로 생성했기 때문에, 기본 문서의 내용이 포함되었으나 결과를 파싱해서 사용하는데에는 별 문제가 없다.

 

 

정리

 

닷넷 프레임워크에서의 강력한 XML 지원을 느낄 수 있는 기능 중의 하나가 XML Serialization입니다. 이 기능을 통해서 좀 더 쾌적하게 XML을 프로젝트에 적용해보는 기회가 되셨으면 좋겠습니다.

 

원 래 이번 아티클은 Flash에서의 웹 서비스 이용 방법에 대한 것이었으나, 잠깐 외도(?)할 셈으로 XML을 편하게 다루기 위한 Serialization을 소개해 보았습니다. 다음 아티클에서는 asp.net에서 간단한 웹 서비스를 구현하고, 그 웹 서비스를 Flash에서 이용하는 방법을 소개하도록 하겠습니다.

 

그럼 : )