티스토리 뷰

WindowsPhone

WP7 개발 기초 - 데이터의 직렬화

생각많은 소심남 2012. 1. 2. 13:44
새해 들어서 첫번째 포스팅이네요..

지난 포스팅에서 끝부분에 살짝 언급된 것처럼 데이터는 IsolatedStorage란 개념을 적용해서 자신이 원하는 데이터를 거기다가 저장할 수 있다고 했습니다. 물론 포스팅 중 다뤘던 App.xaml에서 따로 값을 넘겨받는 것과는 별개로 말입니다.

 IsolatedStorage라는 말은 이름 뜻 그대로 분리된 저장공간입니다.기본적으로 윈폰에서 내장하고 있는 8기가 저장공간 속에는 각각의 어플리케이션이 독립적으로 사용할 수 있는 저장공간이 2기가로 할당되어 있습니다. 이 범위 내에서 어플리케이션끼리 데이터를 공유하면서 사용할 수 있게 됩니다. 실제로는 일반적인 애플리케이션의 설정을 저장하는데 많이 쓰인다고 하네요..

이 부분에 대한 건 책의 뒷부분에 나오니까 이 저장공간을 이용하는 것을 배제하고 다른 방법에 대해 언급해보겠습니다.
우선 전에 하던 프로젝트 내에서 App.xaml 파일을 잠시 보도록 하겠습니다.

 



전에도 몇번 언급했지만 app.xaml 부분은 전반적으로 어플리케이션이 동작하는데 있어 설정을 관리하는 부분인데, 보는 것처럼 WP7내에서의 어플리케이션 동작은 크게 4가지로 구분 됩니다. 지금 위 코드에서는 lifetime, 즉 프로그램의 일생(?)동안에 일어날 수 있는 일을 PhoneApplicationService란 shell상에서 구현한 겁니다.

 우선 첫번째로 Launching은 어플리케이션이 처음으로 동작하는 상태를 말합니다. 지금과 같은 프로그래밍 환경에선 디버깅시 실행되고 난 후의 상황을 말하는 것이겠지요.  

두번째의 Closing은 어플리케이션이 back 버튼을 통해서 종료되는 과정을 말하는 거겠지요. 이 과정에선 어플리케이션 내에서 저장되어 있는 데이터가 경우에 따라서는 날라가 버리는 경우도 염두해둘 수 있습니다.

세번째의 Activated와 네번째의 Deactivated는 그냥 말 그대로 활성화/비활성화된 상태입니다. 이런 환경은 윈도 운영체제를 예를 들면 편하겠네요.

 
지금 보이는 건 윈도 7 의 작업 표시줄의 상태입니다. 제가 실질상으로 Background 상에 켜두고 있는 Visual Studio 를 제외하고는 나머지의 상태는 그냥 멈춰있는 상태입니다. 물론 인터넷이나 동영상과 같이 실시간으로 데이터가 변하는 개체들을 제외하고는 나머지는 그냥 잠자고 있는 상태가 되어있겠지요. 프로세스의 관리 특성상 현재 돌아가고 있는 어플리케이션에 리소스를 최대한 많이 할당해줘야 일을 효율적으로 처리할 수 있습니다. 물론 비 활성화되어 있는 상태에서도 사용자가 원하면 언제든지 활성화 시키고 리소스를 배분할 수 있습니다.

WP7에서는 재미있게도 이러한 개념을 Tombstoning과 Resurrection이란 개념으로 표현했습니다. 비활성화된 어플리케이션은 땅속에 묻어놓고 묘비를 딱 박는 거죠. 이 자리에 어떤게 묻혀있다 라고 말입니다. 그러고 사용자가 네크로맨서가 되서 자기가 원하는 것이 있으면 해당 묘비앞에서 리저랙션 마법을 쓰고 어플리케이션은 좀비처럼 다시 활동하게 됩니다.

하나의 게임과 같은 개념입니다. 마치 디아블로 게임을 프로그램 과정으로 표현한 것 같은 느낌이랄까요?

아무튼 서두가 조금 길었네요. 앞에서 말한 것처럼 PhoneApplicationService 란 shell이 이미 기본적으로 생성되어 있고, 저희는 따라가는 입장에서 이 것을 이용할 것이기에 따로 생성할 필요가 없습니다.

이 PhoneApplicationService에는 State란 속성이 포함되어 있고, 이는 앞에서 잠깐 코드 속에서 나타났던 IDictionary<string, object>란 표현으로 나타납니다. 여기에는 텍스트 키가 있어야 개체를 저장할 수 있고, 오직 어플리케이션이 동작되고 있는 상태에서만 사용할 수 있습니다. 그말은 즉 어플리케이션이 closing된 상태라면 다시 실행시켰을때 이전 상태를 복원할 수가 없다는 것이지요. 이부분을 책에서는 일시적 데이터(Transient data)라고 표현하고 있습니다.

이때문에 데이터를 지속적으로 이어받기 위해서는 바로 직렬화라는 과정이 필요합니다. 포스팅의 제목에서 삼았던 말처럼 직렬화란 이렇게 state에 들어있는 데이터를 받아서 xml로 변환시키고 다시 xml에 있는 데이터를 state로 다시 넣는 과정을 말합니다. 물론 모든 데이터에 대해서 직렬화가 되는 건 아니라고 합니다. 책에서는 예재로 이전 프로젝트 상의 Color를 직렬화한 예제를 선보이고 있습니다.

SecondPage.xaml.cs 파일에서 다음과 같이 수정합니다.
 


우선 맨 앞에서 언급했던 PhoneApplictionService란 shell을 써야 하기 때문에 using 지시자를 사용해서 추가시킵니다.


기존 프로젝트에선 OnNavigatedTo가 없었습니다.이번에 다시 변화를 준 부분은 딱 위의 두개 메서드입니다.

OnNavigatedFrom의 부분에선 background의 색상을 PhoneApplicationService 상의 State에 저장하고 있는게 보입니다. 여기서는 텍스트 키가 Color란 이름으로 구분되고 있습니다.

그래서 다른 페이지로 넘어갈때 활성화되는 OnNavigatedTo란 메서드를 통해서 색이 다시 만들어지고 배경색으로 입혀지는 과정까지 구현되었습니다. 실행 결과는 다음과 같습니다.


이전 프로젝트에선 back 버튼을 눌렀을 때 이전에 고정되었던 페이지 상태의 값이 나타났던 반면에, 이번 프로젝트에선 back버튼을 눌렀을 때 바로 전의 페이지 상태를 이어받는 것을 확인할 수 있었습니다. 물론 앞에서 앞에서 언급했던 것처럼 state는 어플리케이션이 동작되는 과정에서만 값을 유지하기 때문에 start버튼을 눌렀을 때는 값이 초기화 되는 것까지 확인할 수 있습니다.

어떻게 보면 저희가 원하는 목표를 구현하지 못한 거라고 할 수 있습니다. 물론 다시 켰을 때도 이전의 색깔을 유지하고 싶어한다면 이때는 맨앞에 나왔던 isolatedStorage를 사용해야 적절할 거라고 봅니다. 

제가 실행한 범위는 요기까지겠네요. 다음 포스팅에서는 중간에 잠깐 나왔던 툼스토닝에 대해서 언급해보고자 합니다.



 

댓글