2011-01-12 2 views
1

Я десериализую объект, и в некоторых случаях он отлично работает, однако в других он терпит неудачу. Исключение для меня практически бессмысленно, но должен быть способ выяснить, где именно это произошло, поэтому я перенаправляю свою отладку.Как определить, какой объект в графе объектов вызвал SerializationException

Это исключение:

System.Runtime.Serialization.SerializationException был пойман Message = "Нет карты для объекта '201326592'."
Source = "mscorlib" StackTrace: в System.Runtime.Serialization.Formatters.Binary._ BinaryParser.ReadObject() в System.Runtime.Serialization.Formatters.Binary. _BinaryParser.Run() в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler обработчика, __BinaryParser serParser, булевой fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters .Binary.BinaryFormatter.Deserialize (поток serializationStream, HeaderHandler обработчик, булева fCheck, булева isCrossAppDomain, IMethodCallMessage methodCallMessage) на System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (поток serializationStream) в Ana lytics.ReportInstance.Open (Stream TStream, булевы OpenResults) в C: \ Users ... путь ... \ 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» - целое число, идентифицирующий его тип, который должен ссылаться на определение типа ранее в поток - не найденных в таблице типов.

Обычно это не должно происходить, если поток байтов не поврежден в пути - или экземпляр форматирования повторно используется ненадлежащим образом.

A BinaryFormatter отслеживает все, что он уже обработал, и может испускать обратные ссылки на ранее написанные типы и объекты (при сериализации) или использовать ранее прочитанные данные для разрешения обратных ссылок в текущих данных (при десериализации).

+0

Итак, как вы это исправите? – hofnarwillie

+0

@hofnarwillie Это зависит от основной причины. –

Смежные вопросы