2010-02-25 6 views
10

XML 직렬화 프로세스를 디버그/확인하는 데 도움이되는 도구가 있습니까?XML 직렬화 디버깅/검사 도구

예를 들어, 항목이 공개 대신 내부로 표시되었다고 가정합니다. 컴파일 시간 오류 메시지 또는 런타임 오류 메시지가 없습니다. 중단 점을 설정하고 직렬화 프로세스로 들어가면 항목은 그냥 건너 뜁니다. 즉, 이러한 유형의 문제를 찾는 것이 종종 어려울 수 있습니다. 디버그 도구를 사용하면 프로세스를 단계별 실행하고 피드백을 제공 할 수 있습니다. 이 속성을 발견하고 속성을 통해 반복했으며 대응하는 공개 속성을 찾지 못했습니다. 건너 뛰었습니다. 또 다른 옵션은 XML 직렬화 속성이있는 모든 클래스를 검사하여 메소드에 액세스 할 수 있는지 확인하는 도구입니다.

+0

팀, 당신은 지금 길을 디버깅 유지하고, 몇 개월 만에 같은 도구가 필요하지 않습니다. –

+0

FWIW, 원한다면 .NET 소스로 디버깅 할 수 있습니다 (어딘가에서 다운로드 할 수 있으며 라이센스를 읽기 전에 읽을 수 있음). 이것이 정확히 어떻게 작동하는지 알고 싶다면이 모든 것이 좋습니다. –

답변

1

"항목"이란 무엇입니까? 유형이 내부 인 경우 오류 메시지가 표시됩니다. 가장 바깥에있는 예외는 일반적으로 매우 도움이되지 않지만 아래쪽에 .InnerException을 통해 아래로 추적하며 보통 정확히이라는 문구가 나와 있습니다.

회원이 인 경우 전체가이면 확실하게 건너 뜁니다.

여기에 실제 단위 인 통합 테스트가 있습니다. 직렬화에서 원하는 출력은 궁극적으로 외부의입니다. 따라서 출력이 일치하지 않으면 컴파일 타임 메시지가 표시되는지 여부는 중요하지 않습니다 당신이 기대하는 것. 여기서 의미하는 것은 : 직렬화를 수행하고 예상 출력 파일과 비교하는 것입니다. 똑같은 입력. 직렬화하려고 예를 들어

:

[XmlRoot("Node", Namespace="http://flibble")] 
public class MyType { 
    [XmlElement("chileNode")] 
    public string Value { get; internal set; } 
} 

이 (런타임에) 제공 :

임시 클래스 (결과 = 1)를 생성 할 수 없습니다

. 오류 CS0200 : 속성 또는 인덱서는 'MyType.Value'에 할당 할 수 없습니다 - 꽤 특정되는 경우에만

읽습니다.

+0

예를 들어 컬렉션이 internal이고 형식이 internal로 설정된 개체의 컬렉션은 컬렉션의 xmlarray 특성과 개체 유형의 xmltype에 대해 컴파일 시간 또는 런타임 오류를 생성하지 않습니다. ObjectType을 internal로 설정하면 컴파일 타임 오류 메시지가 생성되지만 컬렉션에 형식보다 제한된 액세스 권한이 있기 때문에 오류 메시지가 생성됩니다. 또 다른 예로, XmlAttribute 특성을 사용하여 내부로 설정된 접근 자도 오류를 생성하지 않습니다. 또한 이것은 분명하지만 누락 된 세트입니다. 메소드가 오류를 일으키지 않습니다. – Tim

+0

명확히하기 : 이것은 XML 파일이 올바르게 포맷되었다고 가정합니다. 그것은 완전히 다른 문제입니다. 부적절하게 형식화 된 XML을 처리 할 수 ​​있기 전에 XML을 올바르게 포맷 처리하는 코드를 가져야합니다! – Tim

0

기존 도구에 대해 잘 모르겠지만 리플렉션을 사용하여 클래스를 검사 할 수 있습니다. 리플렉션을 사용하여 serializer에서 생성 된 코드를 볼 수 있습니다.

0

여기서 할 수있는 것은 MS Visual Studio 환경의 SGen.exe 도구를 활용하는 것입니다.

serilizable 유형이 포함 된 어셈블리에서이 도구를 실행하면 "{original-library-name} .XmlSerializers.dll"이라는 라이브러리에 모든 XMLSerializer 버전이 생성됩니다.

'project-options'에서 사용할 수있는 옵션이 설명서에 따라 '기대하지 않는 것이므로'명령 줄 도구 (post-buildstep 어쩌면?)로 실행해야합니다. 이것을 Auto 또는 On으로 설정해도 항상 필요한 어셈블리가 생성되는 것은 아닙니다.

이 도구를 실행 한 후에는 프로젝트의 모든 serializer가 들어있는 라이브러리가 생깁니다. 이제이 라이브러리를 사용하여 예상되는 직렬 변환기를 사용할 수 있는지 여부를 확인할 수 있습니다.복잡한 아무것도 -이 도움이

희망,

3

(직렬화가 불완전하거나 잘못된 경우) 이러한 문제 유형을 테스트하는 가장 간단한 방법은 단위 테스트하는 것입니다.

  • 설정하여 직렬화 유형
  • 의 객체를 만들기의 모든 속성은
  • 직렬화 된 출력을 가지고 그것을
  • 를 직렬화하고 새로운 개체로
  • 확인의 모든 속성을 직렬화 개체가 아직 채워 졌는지 확인합니다.
  • 속성 중 하나라도 예상 값으로 설정되지 않은 경우 단위 테스트에 실패합니다.

일반적으로 구현하려고하는 것이 아니라 입증하려는 동작입니다. 특정 속성을 검사하는 도구는 코드의 단일 구현을 테스트하는 데만 가치가 있습니다. 위와 같은 단위 테스트는 테스트를 다시 작성하지 않고도 모든 형식의 serialization 또는 저장소에서 작동 할 수 있습니다.

5

이 질문을 보는 사람들에게 XmlSerializer의 UnknownNode 및 UnknownAttribute 이벤트에 대한 이벤트 처리기를 추가하면 매우 유용하다는 것을 알았습니다. 새로운 NotImplementedException을 던져 버리더라도, 중단 점을 설정하고 알 수없는 노드와 속성을 만날 때를 볼 수 있습니다. 예를 들어

:

 public void Open(string filename) 
     { 

      // Create serializer 
      XmlSerializer serializer = new XmlSerializer(typeof(ObjectType)); 

      // Set event handlers for unknown nodes/attributes 
      serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode); 
      serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute); 

... 

     } 

     private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e) 
     { 
      throw new System.NotImplementedException(); 
     } 

     private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e) 
     { 
      throw new System.NotImplementedException(); 
     }