У нас есть веб-решение со смешанными проектами C # и VB.NET (3.5) (примечание: в некоторых файлах vb.net Option Strict Off). Наш код работает как модули внутри DotNetNuke 4.8. При определенных условиях наше приложение будет аварийно завершать работу по методу:
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
, показывая InvalidCastException в качестве InnerException без какой-либо дополнительной информации о фактическом значении или имени свойства, которые сериализуются.
Тогда возникает вопрос : как мне узнать, с каким полем и значением у сериализатора возникли проблемы?
Несколько связанных вопросов / проблем, которые пришли в голову при исследовании этой проблемы:
- Если я посмотрю на Formatters.Binary часть MSDN, я бы предположил, что ObjectWriter является внутренним для Binary (как это предлагается в комментариях, красный)?
- Как .NET может вообще прервать приведение Int64 к String? Перефразировано: какое значение для Int64 потенциально не может быть преобразовано в строку? Однако, как отмечено в комментариях: Int64 можно легко преобразовать в строки, но приведение к ним - другая проблема.
- Метод Serialize не сообщает об этом ArgumentException, иначе может возникнуть InvalidCastException (в разделе «Исключения»).
Я пытался исследовать XYZ
и типы для свойств в этом классе в ildasm, чтобы увидеть любые нарушения, но не смог их найти.