XML Serialize

Program/C# 2008. 4. 1. 12:00
환경 : VS2008, WPF 프로젝트

Xml Selralize 를 사용하는데 있어서 좋은 정보를 제공하는 곳입니다.
http://www.ensimple.net/enSimple/show.aspx?cnum=68&b_id=study_csharp&page=1

http://www.topxml.com/xmlserializer/serialize_class.asp

Serialize 를 사전에서 찾아보면 "번호순으로 나열하다" 라는 군요..
데이터를 스트림의 형식으로 표현하여 읽고 쓰기를 한다는 의미 같습니다.

제가 Serialize 를 사용하게 된 계기는 XML 문서를 메모리 상에 클래스로 구조화 하기 위해서 였습니다.
그러기 위해선 우선 해당 XML 문서의 형식에 맞는 클래스가 존재 하여야 할 것입니다.

MSDN을 에서 XSD를 검색해보면 ..
XML 문서의 스키마를 생성하고 이를 클래스 화 하는 방법에 대해서 아실 수 있을 겁니다.
이렇게 생성된 클래스를 사용하는데 있어서 주의 할 점은..
기본값의 사용입니다. XML 무서의 특정 노드에 값이 없을경우 클래스는 기본 값 설정을 하여야 할 것입니다.
또한 노드 컬렉션에 값이 없을경우 이런 경우 클래스의 컬렉션은 null 값 조차 가지지 않습니다.
해당 컬렉션의 유효성을 판단하기 위해 null 비교 하였다면 바로 에러가 날 것입니다.
스키마 혹은 클래스를 조작하여 이런 경우에 대비 할수가 있습니다만,
이번 포스트의 범위가 아니므로 넘어가도록 하겠습니다.

XML 문서의 구조가 비교적 간단 하다하면 위와 다르게 직접 클래스를 생성하셔도 될것입니다.
XML 시리얼 라이져는 프로퍼티 및 public 영역에 대해 XML 문서와의 매칭을 하게 됩니다.

[XmlAttribute()]
public string book {get; set;}

이런식으로 선언하게 되면 book 이라는 에트리 뷰트가 생성되게 되는 거죠...
주목할 점은 [] 부분 입니다.
사실 대괄호 안의 값을 변경함으로서 우리는 좀 더 테크니컬할 클래스를 생성 할 수가 있습니다.
이에 대한 설명은 상단의 두번째 링크된 페이지를 참조 하시면 될 것입니다.

클래스의 이름은 노드가 되고 클래스 내에 설정된 에트리 뷰트 및 노드들은 클래스 노드의 자식노드가 됩니다.
만약 클래스가 컬렉션을 포함하고 있다 해도 같은 원리가 되는 것이지요..
사용자 삽입 이미지


읽어드리는.. 디시리얼 라이즈 하는 부분입니다.
Page 라는 클래스는 제가 정의한 클래스 입니다.
이 클래스 타입에 맞는 시리얼라이져를 생성한후,
읽어드릴 XML 문서의 경로에 해당하는 XmlTextReader 를 생성합니다.
그리고 디시리얼라이즈.. 간다하죠..

그렇다면 쓰기.. 시리얼라이즈 하는 부분에 대해서 알아볼까요..
사용자 삽입 이미지


기본 디시리얼라이즈에 역순입니다.
XmlSerializerNamespaces 라는 것은 시리얼라이즈시에 루트 노드의 네임스페이스를 셋팅하는 부분입니다.
저부분을 삭제하고 실행 해보면 기본 네임스페이스(?? 기억이..)가 들어가는 것을 보실 수 있습니다.

잦은 시리얼라이즈의 사용은 프로그램에 부하가 된다고 합니다만.. 전 아직 잘 모르겠군요..
잦은 이라는 정도가 어느 선까지를 말하는지...

이제 시리얼라이즈의 대상이 되는 클래스를 만드는 부분과 DOM 에 대한 이해만 충분하다면
XML 문서를 조작하는데 있어서는 무리 없을 것 같습니다.

이는 다음 기회에 ~
: