2011-12-07 1 views
1

우리는 C#과 VB.NET (3.5) 프로젝트가 혼합 된 웹 솔루션을 제공합니다 (참고 : 여러 vb.net 파일에는 Option Strict가 없습니다). 우리 코드는 DotNetNuke 4.8에서 모듈로 실행됩니다. 특정 조건에서, 우리의 응용 프로그램은 방법에 충돌합니다 :Serialization throwing ArgumentException/InvalidCastException : 디버그 접근이 필요합니다.

System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString 

그 예외의 축약 된 메시지는 다음과 같습니다 스택 추적에서 아무데도

System.ArgumentException: "Error serializing value XYZ of type XYZ." 
System.InvalidCastException: "Unable to cast object of type 'System.Int64' 
to 'System.String'" 

는 우리의 코드, 그것은 끝 단지 시스템 코드입니다 코드에서 XYZ 유형을 직렬화하지 못했습니다. 즉, 중단 점을 맞출 수없고 XYZ의 정확한 특성이 문제인지 디버그 할 수 없습니다. 스택 추적 속성은 비어 있지만 메시지로 축약 스택 추적입니다 :이 추적에

DotNetNuke.Services.Exceptions.PageLoadException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.ArgumentException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.InvalidCastException: "Unable to cast object of type 'System.Int64' to type 'System.String'. " 
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject) 
// ...... etc......... 
at System.Web.UI.Page.SaveAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
// --- End of inner exception stack trace 

모든 관련 라인 System. 시작은. 맨 윗줄은 DotNetNuke입니다. 그러나 첫 번째 답변의 제안에 따라 DotNetNuke (4.8) 코드를 직접 컴파일하고 그 코드가 Server.GetLastError을 나타내며 InvalidException으로 InvalidException을 표시합니다. 실제 값이나 속성 이름에 대한 추가 정보는 직렬화되지 않습니다.

그러면 질문은입니다. serializer에서 문제가되는 필드와 값을 어떻게 확인할 수 있습니까?

몇 가지 관련 질문/마음에 와서 문제가있는 동안이 문제를 연구 :

  • 내가 MSDN의 Formatters.Binary 부분을 보면 나는 의견 제시로 ObjectWriter가 (진 내부 추측 것 , 빨강)?
  • .NET에서 Int64를 String으로 형 변환하지 못하는 이유는 무엇입니까? Rephrased : Int64의 어떤 값을 잠재적으로 String으로 변환 할 수 없습니까? 그러나 주석에서 지적한대로 Int64는 String으로 쉽게 변환 될 수 있지만 Casting은 다른 문제입니다.
  • Serialize 메서드는이 ArgumentException을 알리지 않거나 (예외 섹션에서) InvalidCastException이 발생할 수 있습니다.

나는 어떤 부정을 볼 수 ILDASM에서 해당 클래스의 속성 XYZ과 유형을 조사하려고했지만 하나를 찾을 수 없습니다.

+1

'(string) 42L'은 InvalidCastException을 던지고 다른 Int64 값도 던졌습니다. Int64 값은'string'으로 형 변환 될 수 없습니다. (Convert.ToString (42L) 또는 42L.ToString()을 사용하여 ** 문자열을 ** 문자열로 변환 할 수 있습니다.) – dtb

+1

'ObjectWriter'는 System.Runtime의'internal' 클래스입니다. Serialization.Formatters.Binary' 네임 스페이스. – dtb

+0

두 가지 유용한 의견을 보내 주셔서 감사합니다. 말이된다. 이 부분에 대한 질문을 업데이트하겠습니다. – Jeroen

답변

0

내 자신의 질문에 대답하면 검색 쿼리 후 여기있는 모든 사용자에게 도움이 될 것입니다.

최종 답변은 this SO question입니다. 결국 mscorlib 코드를 사용하기 위해 .NET Reflector (및 포함 된 Visual Studio 2010 플러그인)의 평가판을 사용하여 끝내게되었습니다. 이를 통해 InvalidCastException을 일으키는 속성의 NameInfo를 검사 할 수있었습니다.

간단히 말해, 대답은 .NET 반사경 (또는 유사한 도구)을 사용하여 mscorlib을 단계적으로 사용하는 것입니다.


추신. mscorlib에 발을 들여 놓은 것이이 질문에 제기 된 나의 문제에 대한 해답 이었지만, 일단 충분한 정보를 얻으면 완전히 새로운 SO 문제를 보증하는 근본적인 문제가 남아 있습니다.

+0

DNN 프레임 워크에있는 경우에도 제미로 로그인하는 것을 잊지 마십시오. 대답은 무효 캐스트를 더 잘 포착하고보고하는 것입니다. –

+0

결국, 나는 DNN이'Server.GetLastError'로 문제를 알아 차리는 것을 제외하고는 아무 관계가 없다고 생각합니다. 내가 이것에 관해 무엇인가 발견하면 나는 할 것이다. 이 질문에 대한 모든 조언과 의견을 보내 주셔서 감사합니다. D – Jeroen

2

스택 추적이 무엇인지 언급하지 않았지만 관련이 없습니다.

DotNetNuke 코드에있는 경우 디버거에 DotNetNuke 소스를로드하고 예외를 다시 작성합니다. 또한 (관련 버전) DotNetNuke 소스를 컴파일하고 새로 컴파일 된 dll 및 .pdb 파일을 \ bin 디렉토리에 놓는 방법으로도 벗어날 수 있습니다.

설정이 완료되면 Visual Studio -> 디버그, 예외로 이동하여 'Thrown'열에 'Common Language Runtime Exceptions'옆에 확인란을 지정하십시오. '기본 런타임 검사'로 실험 할 수도 있습니다.

그런 다음 테스트를 다시 만드십시오. 예외가 발생하는 시점에서 코드가 중단됩니다. 이런 일이 생기면 스택 추적을 통해 그 지점까지의 경로를 검사 할 수있을뿐 아니라 문제의 원인이되는 값을 확인할 수 있습니다.

이 접근법을 사용하면 try/catch가 코드를 처리하는 방법으로 사용되는 곳이 있으며,이 모든 코드가 표시된다는 점을 제외하고는 많은 예외가 있습니다. 필요한 예제를 찾을 때까지 이러한 예제를 단계별로 살펴 보겠습니다.

그 밖의 모든 것이 실패하면 'try/catch'를 사용하여 다시 컴파일하고 문제가되는 값을 기록/중단하지만 그만큼 멀리 갈 필요는 없습니다. Visual Studio에서 던진 오류를 해결하면 문제를 격리하기에 충분합니다.

+0

조언 해 주셔서 감사합니다. 나는 확실히 시간을 갖고 Q를 업데이트하고/또는 그것이 효과가 있다면 답을 받아 들일 것이다. – Jeroen

+0

또한 스택 추적 정보로 질문을 업데이트 할 것입니다. – Jeroen

+0

이것은 좋은 제안 이었지만 불행히도 내 문제에 대한 대답은 아닙니다. DotNetNuke에서 중단 점에 도달했을 때'Server.GetLastError'를 처리하는 것으로 나타 났으며 그 시점에서 InnerException ('InvalidCastException')은 직렬화에 실패한 실제 값 (또는 속성)에 대한 정보를 제공하지 않습니다. – Jeroen