직렬화 개념
- 직렬화(serialization)는 메모리 안의 객체 하나 또는 객체 그래프(서로 참조하는 객체들의 집합)를 저장 또는 전송에 적합한 바이트 스트림 또는 XML 노드들로 평탄화(flattening)하는 연산을 뜻한다.
- 그 반대는 역직렬화(deserialization), 즉 자료 스트림을 해석해서 메모리 안의 객체 또는 객체 그래프를 재추축하는 연산이다.
- 직렬화와 역직렬화의 주된 용도는 다음 두 가지이다.
- 객체를 네트워크나 응용 프로그램 경계 너머로 전송한다.
- 객체를 파일이나 데이터베이스에 저장한다.
- 그보다 덜 자주 쓰이는 용도는 객체들을 깊게 복제하는 것이다. 또한 직렬화 및 역직렬화 기능을 제공하는 자료 계약(data contract) 직렬화 엔진과 XML 직렬화 엔진을 XML 파일(구조가 알려진)의 저장과 적재를 위한 범용 도구로 사용할수도 있다.
- .NET Framework는 직렬화 및 역직렬화를, 객체들의 직렬화/역직렬화를 원하는 클라이언트의 관점에서는 물론 자신의 직렬화 방식을 어느 정도 제어하고자 하는 형식의 관점에서도 지원한다.
직렬화 엔진
- .NET Framework는 다음과 같은 네 가지 직렬화 메커니즘을 제공한다.
- 자료 계약 직렬화기
- 이진 직렬화기(데스크톱 응용 프로그램에서)
- (특성 기반) XML 직렬화기(XmlSerializer)
- IXmlSerializable 인터페이스
- 이 중 처음 셋은 직렬화 작업의 대부분 또는 전부를 실제로 수행하는 직렬화 ‘엔진’이다. 마지막은 XmlReader와 XmlWriter를 이용해서 직렬화를 독자가 직접 구현하는데 필요한 틀을 제공할 뿐이다.
- IXmlSerializable은 자료 계약 직렬화기(data contract serializer)와 함께 사용할 수도 있고, XmlSerializer와 함께 사용할 수도 있다 (좀 더 복잡한 XML 직렬화 과제를 처리하려는 경우)
- 아래 표는 네 메커니즘을 비교한 것이다 별표가 많을수록 점수가 높다.
제목 없음
- IXmlSerializable의 점수들은 독자가 XmlReader와 XmlWriter를 이용해서 코드를 최적으로 작성했다고 가정한 것이다. XML 직렬화 엔진에서 좋은 성능을 내려면 같은 XmlSerializer 객체를 재사용해야 한다.
엔진이 세 개인 이유
- 엔진이 세 개나 되는 것은 어느 정도 역사적인 이유 떄문이다. 초창기 .NET Framework에서 직렬화 기능은 다음과 같은 서로 다른 두 목표를 위해 만들어졌다.
- .NET 객체 그래프를 형식과 참조를 충실히 보존할 수 있는 방식으로 직렬화한다.
- XML과 SOAP 메시징 표준들과의 상호운용성을 보장한다
- 첫 목표는 Remoting Framework의 요구에서 비롯된 것이고, 둘째 목표는 Web Services의 요구 때문이다. 두 목표를 모두 만족하는 하나의 작렬화 엔진을 작성하는 것은 너무 벅찬 일이라서 Microsoft는 엔진을 두 개 작성했다. 그것이 바로 이진 직렬화기와 XML 직렬화기이다.
- 이후 WCF(Windows Communication Foundation)가 .NET Framework 3.0에 도입되면서 Remoting과 Web Services를 통합하는 것이 목표의 일부가 되었다. 이를 위해서는 새로운 직렬화 엔진이 필요했다. 자료 계약 직렬화기가 바로 그것이다.
- 자료 계약 직렬화기는 (상호운용적) 메시징에 관련된 두 기존 엔진의 기능들을 통합한다. 그러나 이러한 문맥 바깥에서는 기존의 두 엔진도 여전히 중요하다.
자료 계약 직렬화기
- WCF에 쓰이는 자료 계약 직렬화기는 세 직렬화 엔진 중 최시느이 그리고 가장 다재다능한 엔진이다. 이 직렬화기는 다음 두 상황에서 특히나 강력하다.
- 표준을 준수하는 메시징 프로토콜들을 통해서 정보를 교환할 때
- 버전 내구성(version tolerance)이 좋아야 하고 객체 참조들을 유지할 수 있으면 더욱 좋을 때
- 자료 계약 직렬화기는 자료 계약(data contract) 모형을 지원한다. 이 모형은 직렬화하려는 형식의 저수준 세부사항을 직렬화된 자료의 구조로부터 분리하는데 도움이 된다.
- 이 모형을 따르면 버전 내구성이 아주 좋아진다. 버전 내구성이 좋다는 것은 객체를 직렬화할 때 쓰인 형식의 버전이 객체를 역직렬화할 떄 쓰이는 형식의 버전과 달라도 객체를 최대한 잘 복원할 수 있음을 뜻한다. 심지어 이름이 바뀌거나 다른 어셈블리로 이동한 형식도 역직렬화할 수 있다.
- 자료 계약 직렬화기는 대부분의 객체 그래프를 지원하지만, 이진 직렬화기보다 프로그래머의 손이 많이 가는 떄도 있다. 다루고자 하는 XML의 구조를 어느 정도 임의로 제어할 수 있는 경우에는 자료 계약 직렬화기를 XML 파일을 읽고 쓰는 범용 도구로 사용할 수도 있다. (자료를 XML 요소의 특성들에 저장해야 하거나 XML 요소들이 임의의 순서로 등장하는 경우에는 자료 계약 직렬화기를 사용할 수 없다.)
이진 직렬화기