XmlSerializer 클래스 사용
WCF(Windows Communication Foundation)에서는 두 가지 다른 serialization 기술을 사용하여 응용 프로그램의 데이터를 클라이언트와 서비스 간에 전송되는 XML로 바꿀 수 있습니다. 이 프로세스를 serialization이라고 합니다.
기본값인 DataContractSerializer
기본적으로 WCF에서는 DataContractSerializer 클래스를 사용하여 데이터 형식을 serialize합니다. 이 serializer는 다음 형식을 지원합니다.
- 기본 형식(예: 정수, 문자열 및 바이트 배열) 및 기본 형식으로 처리되는 XmlElement 및 DateTime 같은 일부 특수 형식
- 데이터 계약 형식(DataContractAttribute 특성으로 표시된 형식)
- ISerializable 인터페이스를 구현하는 형식을 포함하여 SerializableAttribute 특성으로 표시된 형식
- IXmlSerializable 인터페이스를 구현하는 형식
- 많은 제네릭 컬렉션 형식을 비롯한 많은 일반 컬렉션 형식
많은 .NET Framework 형식은 끝의 두 범주에 해당하므로 serialize할 수 있습니다. serialize할 수 있는 형식의 배열도 serialize할 수 있습니다. 전체 목록을 보려면 서비스 계약에서 데이터 전송 지정을 참조하십시오.
데이터 계약 형식과 함께 DataContractSerializer를 사용하여 새 WCF 서비스를 작성하는 것이 좋습니다. 자세한 내용은 데이터 계약 사용을 참조하십시오.
XmlSerializer 클래스 사용 시기
WCF에서는 XmlSerializer 클래스도 지원합니다. XmlSerializer 클래스는 WCF에서 고유하지 않습니다. 이는 ASP.NET 웹 서비스에서 사용되는 serialization 엔진과 동일합니다. XmlSerializer 클래스는 DataContractSerializer 클래스보다 훨씬 더 제한된 형식 집합을 지원하지만 결과 XML을 보다 강력하게 제어할 수 있으며 XSD(XML 스키마 정의 언어) 표준의 더 많은 부분을 지원합니다. 또한 이 클래스에는 serialize할 수 있는 형식의 선언적 특성이 필요 없습니다. 자세한 내용은 .NET Framework 설명서의 XML Serialization 항목을 참조하십시오. XmlSerializer 클래스는 데이터 계약 형식을 지원하지 않습니다.
Svcutil.exe 또는 Visual Studio의 서비스 참조 추가 기능을 사용하여 타사 서비스에 대한 클라이언트 코드를 생성하거나 타사 스키마에 액세스하는 경우 적절한 serializer가 자동으로 선택됩니다. 스키마가 DataContractSerializer와 호환되지 않으면 XmlSerializer가 선택됩니다.
XmlSerializer로 수동 전환
경우에 따라 수동으로 XmlSerializer로 전환해야 할 수도 있습니다. 예를 들어 다음과 같은 경우 수동 전환할 수 있습니다.
- ASP.NET 웹 서비스에서 WCF로 응용 프로그램을 마이그레이션하는 경우 새 데이터 계약 형식을 만드는 대신 기존의 XmlSerializer 호환 형식을 다시 사용할 수 있습니다.
- 메시지에 표시되는 XML에 대한 정확한 제어가 중요하지만 WSDL(웹 서비스 기술 언어) 문서를 사용할 수 없는 경우(예: DataContractSerializer와 호환되지 않는 특정 표준화 및 게시된 스키마를 준수해야 하는 형식의 서비스를 만드는 경우)
- 레거시 SOAP 인코딩 표준을 따르는 서비스를 만드는 경우
위의 경우를 비롯한 여러 경우에서 다음 코드와 같이 XmlSerializerFormatAttribute 특성을 서비스에 적용하여 XmlSerializer 클래스로 수동 전환할 수 있습니다.
보안 고려 사항
참고
serialization 엔진을 전환할 때는 주의해야 합니다. 사용하는 serializer에 따라 같은 형식이 XML로 다르게 serialize될 수 있습니다. 실수로 잘못된 serializer를 사용하면 공개하려 하지 않았던 형식의 정보를 공개하게 될 수 있습니다.
예를 들어 DataContractSerializer 클래스는 데이터 계약 형식을 serialize할 때 DataMemberAttribute 특성으로 표시된 멤버만 serialize하고, XmlSerializer 클래스는 모든 public 멤버를 serialize합니다. 다음 코드의 형식을 참조하십시오.
XmlSerializer 클래스가 선택된 서비스 계약에 실수로 이러한 형식을 사용하면 의도하지 않게 creditCardNumber
멤버가 serialize됩니다.
DataContractSerializer 클래스는 기본값이지만 DataContractFormatAttribute 특성을 서비스 계약 형식에 적용하여 서비스에 대해 명시적으로 이 클래스를 선택할 수 있습니다. 그러나 실제로 이렇게 해야 하는 경우는 없습니다.
서비스에 사용되는 serializer는 계약에서 없어서는 안 될 부분이며 다른 바인딩을 선택하거나 기타 구성 설정을 바꿔서 변경할 수 없습니다.
XmlSerializer 클래스에 적용되는 다른 중요한 보안 고려 사항은 다음과 같습니다. 먼저 XmlSerializer 클래스를 사용하는 WCF 응용 프로그램을 키로 서명하여 공개되지 않도록 보호하는 것이 좋습니다. 이 권장 사항은 XmlSerializer로 수동 전환을 수행할 때와 Svcutil.exe, 서비스 참조 추가 또는 유사한 도구를 사용하여 자동 전환을 수행할 때 모두 적용됩니다. 이는 XmlSerializer serialization 엔진이 미리 생성된 serialization 어셈블리의 로드를 지원하기 때문입니다. 단, 미리 생성된 serialization 어셈블리가 응용 프로그램과 동일한 키로 서명되어 있어야 합니다. 응용 프로그램에 서명이 없으면 미리 생성된 serialization 어셈블리의 예상 이름과 일치하는 악성 어셈블리가 응용 프로그램 폴더나 전역 어셈블리 캐시에 배치될 수 있습니다. 물론 공격자가 악성 어셈블리를 이용하려면 먼저 두 위치 중 하나에 대한 쓰기 권한을 얻어야 합니다.
XmlSerializer를 사용할 때마다 나타나는 또 다른 위협은 시스템 임시 폴더에 대한 쓰기 권한과 관련이 있습니다. XmlSerializer serialization 엔진은 이 폴더에 임시 serialization 어셈블리를 만들고 사용합니다. 시스템 임시 폴더에 대한 쓰기 권한이 있는 모든 프로세스에서 이러한 serialization 어셈블리를 악성 코드로 덮어쓸 수 있음에 유의해야 합니다.
XmlSerializer 지원에 대한 규칙
XmlSerializer 호환 특성을 계약 작업 매개 변수나 반환 값에 직접 적용할 수 없지만, 다음 코드와 같이 형식화된 메시지(메시지 계약 본문 부분)에 적용할 수는 있습니다.
이러한 특성을 형식화된 메시지 멤버에 적용하면 메시지 특성에서 충돌하는 속성이 재정의됩니다. 예를 들어 다음 코드에서 ElementName
은 Name
을 재정의합니다.
MessageHeaderArrayAttribute 특성은 XmlSerializer를 사용할 때 지원되지 않습니다.
참고
이 경우 WCF 전에 발표된 XmlSerializer는 "스키마의 맨 위에 선언된 요소에 maxOccurs를 1보다 큰 값으로 지정할 수 없습니다. XmlElementAttribute 대신 XmlArray 또는 XmlArrayItem을 사용하거나 Wrapped 매개 변수 스타일을 사용하여 'more'에 래퍼 요소를 제공하십시오."라는 예외를 throw합니다.
이러한 예외가 표시되면 이 경우에 해당하는지 확인하십시오.WCF는 메시지 계약 및 작업 계약에서 SoapIncludeAttribute 및 XmlIncludeAttribute 특성을 지원하지 않습니다. 대신 KnownTypeAttribute 특성을 사용하십시오.
참고 항목
작업
방법: XmlSerializer를 사용하여 WCF 클라이언트 응용 프로그램의 시작 시간 개선
참조
DataContractFormatAttribute
DataContractSerializer
XmlSerializer
MessageHeaderArrayAttribute