2011-01-12 3 views
1

개체를 deserialize하고 경우에 따라 제대로 작동하지만 실패한 개체도 있습니다. 예외는 본질적으로 나에게 의미가 없지만 디버깅을 리디렉션 할 수 있도록 정확히 어디에서 실패했는지 파악할 수있는 방법이 있어야합니다. 개체 그래프에서 SerializationException을 일으킨 개체를 확인하는 방법은 무엇입니까?

는 예외입니다 ". '201326592' 개체에 대한지도합니다" 이 메시지 = 적발되지 않았다

System.Runtime.Serialization.SerializationException = "mscorlib의"스택 트레이스
자료 : System.Runtime.Serialization.Formatters.Binary에서 System.Runtime.Serialization.Formatters.Binary._ BinaryParser.ReadObject()에서 . System.Runtime.Serialization.Formatters에서 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (isCrossAppDomain, IMethodCallMessage methodCallMessage HeaderHandler 핸들러 __BinaryParser serParser, 부울 fcheck가 부울 )에서 _BinaryParser.Run() .Binary.BinaryFormatter.Deserialize (트림 serializationStream, HeaderHandler 핸들러 부울 fcheck가 부울 isCrossAppDomain, IMethodCallMessage methodCallMessage) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize시 (스트림 serializationStream) 시 아나 C에서 lytics.ReportInstance.Open (스트림 은 TStream, 부울 OpenResults) : \ 사용자 ... 경로 ... \ File.vb : 라인 149의 InnerException :

그리고 이것은 소스 코드 곳입니다 갇혀 :

Public Shared Function Open(ByVal tStream As IO.Stream, Optional ByVal OpenResults As Boolean = False) As ReportInstance 
     Dim tFormatter As System.Runtime.Serialization.Formatters.Binary.BinaryFormatter = PluginSerializationBinder.CreateSerializer() 
     Dim tInstance As ReportInstance 
     Try 
      If OpenResults Then 'case which always fails 
       'open the entire report 
       If System.Diagnostics.Debugger.IsAttached Then 
        Console.WriteLine("Deserializing: report results") 
       End If 
       tInstance = tFormatter.Deserialize(tStream) 'throws exception here 
       Return tInstance 
      Else 'case which always works (only deserializing part of the object) 
       'just open the stub 
       If System.Diagnostics.Debugger.IsAttached Then 
        Console.WriteLine("Deserializing: report instance") 
       End If 
       Dim tInput As New IO.BinaryReader(tStream) 
       Dim tLength As Long = tInput.ReadInt64() 
       Dim tBytes() As Byte = tInput.ReadBytes(tLength) 
       Dim tMem As New IO.MemoryStream(tBytes) 
       tInstance = tFormatter.Deserialize(tMem) 
       Return tInstance 
      End If 
     Catch ex As Exception 
      If (ex.Message.Contains("blah")) Then 
       Throw New UnsupportedException(ex.Message) 
      Else 
       Throw 'trapped here 
      End If 
     End Try 
    End Function 

감사합니다, 브라이언

답변

1

당신이보고있는 예외가 발생되는 경우 개체의 "ID 매핑"- 정수는에 이전 타입 정의를 참조해야 유형을 식별 스트림 - 아니다 유형 표에서 찾을 수 있습니다.

일반적으로 바이트 스트림이 전송 중 맹 글링되지 않거나 포매터 인스턴스가 부적절하게 재사용되지 않으면 이러한 일이 발생하지 않아야합니다.

BinaryFormatter은 이미 처리 한 모든 내용을 추적하고 이전에 기록한 유형 및 객체에 대한 역 참조를 방출하거나 (직렬화 할 때) 이전에 읽은 데이터를 사용하여 현재 데이터의 역 참조를 해독 할 수 있습니다.

+0

그럼 어떻게 수정합니까? – hofnarwillie

+0

@hofnarwillie 근본 원인에 따라 다릅니다. –

관련 문제