C#에서 상속 관계를 가진 클래스를 XML로 직렬화할 때 발생하는 "정적으로 알려지지 않은 형식" 오류의 원인과 해결 방법을 정리해보겠습니다~
발생 오류 ⚠️
코드 실행 중 다음과 같은 예외가 발생할 때 이 방법을 사용합니다.
- 에러 메시지:
XML 문서를 생성하는 동안 오류가 발생했습니다. - 상세 메시지 (InnerException):
typeName 형식은 사용할 수 없습니다. XmlInclude 또는 SoapInclude 특성을 사용하여 정적으로 알려지지 않은 형식을 지정하십시오.
해결 방법 ✅
부모 클래스 선언부 상단에 [XmlInclude(typeof(자식클래스))]를 추가하면 바로 해결할 수 있어요!
[XmlRoot("Rootname")]
[XmlInclude(typeof(ChildClassName))] // 해결 방법: 자식 클래스 타입을 미리 등록하세요.
public class ParentClassName
{
[XmlAttribute("id")]
public string Id { get; set; }
// ...공통 필드
}
// 상속받은 자식 클래스
public class ChildClassName : ParentClassName { ... }
오류 원인 🔍
XmlSerializer는 기본적으로 부모 클래스(ParentClassName)만 인식하도록 설계되어 있습니다. 하지만 실제 데이터로 자식 클래스(ChildClassName) 인스턴스가 들어오면, Serializer는 "배운 적 없는 타입"이라며 보안 및 구조적 이유로 직렬화를 중단하기 때문이에요. 그리하여 XmlInclude 어트리뷰트를 통해 파생 클래스에서 형식 인식을 허용하도록 하는 것이지요.
