ASP.NET XML 직렬화 문제: DataContractSerializer에 대한 관찰

클라이언트가 이상한 문제로 우리에게 연락했습니다. 그들의 ASP.NET WebAPI 프로젝트(다소 레거시 기술)는 메인프레임에서 실행되는 애플리케이션(공룡급 레거시 기술)과 통신해야 했습니다. 하지만 XML 직렬화 문제가 있었습니다…

그들은 테스트 XML 페이로드를 가지고 있었지만 그 중 절반만 계속해서 전송되었습니다.

가장 먼저 의심되는 것은 DataContract/DataMember 속성이 누락되었지만 모든 것이 정상인 것 같습니다.

[DataContract(Name = "ComplexObject", Namespace = "")]
public class ComplexObject
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Location { get; set; }
    [DataMember]
    public string Reference { get; set; }
    [DataMember]
    public double Rate { get; set; }
    [DataMember]
    public double DiscountedRate { get; set; }
}


잠시 머리를 긁적이며 StackOverflow 전체에서 다른 솔루션을 시도한 후 이 동작을 설명하는 piece of documentation을 파헤쳤습니다.
  • 기본 클래스의 데이터 멤버(직렬 변환기가 이 규칙을 재귀적으로 위쪽으로 적용한다고 가정).
  • 알파벳 순서의 데이터 멤버(빙고!);
  • 데코레이션 속성에서 특별히 번호가 지정된 데이터 멤버.

  • 위의 내용을 염두에 두고 성공적으로 직렬화할 다음 페이로드를 얻었습니다.

    다른 옵션이 있습니다



    .NET에는 XmlSerializerDataContractSerializer 두 개 이상의 XML 직렬 변환기가 함께 제공됩니다. 두 사람에 대해 많이 쓰여졌습니다. 이 항목article written by Dan Rigsby이 이 주제에 대한 최고의 정보원일 것입니다.

    우리에게 중요한 차이점은 XmlSerializer에 장식이 필요하지 않고 즉시 사용할 수 있다는 사실입니다. 동안DataContractSerializer은 코드를 변경해야 합니다. 우리 프로젝트에서 모든 것이 이미 DataContract 로 설정되었으므로 아무 것도 변경할 필요가 없습니다.

    기본적으로 WebAPI 프로젝트는 활용하도록 구성됩니다DataContractSerializer. 그러나 문제가 발생할 경우 XMLSerializer를 사용하도록 전환할 수 있음을 알면 도움이 됩니다.

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.XmlFormatter.UseXmlSerializer = true; // global setting for all types
            config.Formatters.XmlFormatter.SetSerializer<ComplexObject>(new XmlSerializer(typeof(ComplexObject))); // overriding just for one type
    


    설정 순서



    ASP.NET XML 직렬화 문제를 처리하는 또 다른 옵션은 속성 순서를 명시적으로 정의하는 것입니다.

    [DataContract(Name = "ComplexObject", Namespace = "")]
    public class ComplexObject
    {
        [DataMember(Order = 1)]
        public int Id { get; set; }
        [DataMember(Order = 2)]
        public string Name { get; set; }
        [DataMember(Order = 3)]
        public string Location { get; set; }
        [DataMember(Order = 4)]
        public string Reference { get; set; }
        [DataMember(Order = 5)]
        public double Rate { get; set; }
        [DataMember(Order = 6)]
        public double DiscountedRate { get; set; }
    }
    


    결론



    XML 직렬화는 .NET이 시작된 이래로 사용되었습니다. 그리고 JSON이 인수한 것처럼 보일 수 있지만 XML은 곧 아무데도 가지 않을 것입니다. 필요할 때 대처할 수 있는 방법이 많다는 것을 아는 것은 좋은 일입니다.

    좋은 웹페이지 즐겨찾기