우리는 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
과 유형을 조사하려고했지만 하나를 찾을 수 없습니다.
'(string) 42L'은 InvalidCastException을 던지고 다른 Int64 값도 던졌습니다. Int64 값은'string'으로 형 변환 될 수 없습니다. (Convert.ToString (42L) 또는 42L.ToString()을 사용하여 ** 문자열을 ** 문자열로 변환 할 수 있습니다.) – dtb
'ObjectWriter'는 System.Runtime의'internal' 클래스입니다. Serialization.Formatters.Binary' 네임 스페이스. – dtb
두 가지 유용한 의견을 보내 주셔서 감사합니다. 말이된다. 이 부분에 대한 질문을 업데이트하겠습니다. – Jeroen