Я столкнулся с очень неприятной проблемой, которую не могу определить.
Я запускаю очень большое бизнес-приложение ASP.Net, содержащее многие тысячи объектов; Он использует сериализацию/десериализацию в памяти с помощью MemoryStream, чтобы клонировать состояние приложения (страховые контракты) и передавать его другим модулям. Он работал нормально в течение многих лет. Теперь иногда, не систематически, при сериализации выдает исключение
Конструктор массива десятичных байтов требует массива длины четыре, содержащего действительные десятичные байты.
Запуск одного и того же приложения с теми же данными, 3 раза из 5 работает. Я включил все исключения CLR, Отладка - Исключения - Исключение CLR - Включено, поэтому я предполагаю, что если произойдет неправильная инициализация/назначение десятичного поля, программа должна остановиться. Этого не происходит.
Я пытался разделить сериализацию на более простые объекты, но это очень сложно, попытаться определить поле, вызывающее проблему. С рабочей версии в производстве и этой я перешел с .Net 3.5 на .NET 4.0, и были внесены последовательные изменения в часть пользовательского интерфейса, а не в бизнес-часть. Терпеливо пройдусь по всем изменениям.
Это похоже на старомодные проблемы C, когда char *p
пишет туда, куда не должен, и только в процессе сериализации, когда он проверяет все данные, проблема появляется.
Возможно ли что-то подобное в управляемой среде .Net? Приложение огромно, но я не вижу аномального роста памяти. Что может быть способом отладки и отслеживания проблемы?
Ниже приведена часть трассировки стека
[ArgumentException: Decimal byte array constructor requires an array of length four containing valid decimal bytes.]
System.Decimal.OnSerializing(StreamingContext ctx) +260
[SerializationException: Value was either too large or too small for a Decimal.]
System.Decimal.OnSerializing(StreamingContext ctx) +6108865
System.Runtime.Serialization.SerializationEvents.InvokeOnSerializing(Object obj, StreamingContext context) +341
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +448
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +969
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +1016
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +319
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) +17
Allianz.Framework.Helpers.BinaryUtilities.SerializeCompressObject(Object obj) in D:\SVN\SUV\branches\SUVKendo\DotNet\Framework\Allianz.Framework.Helpers\BinaryUtilities.cs:98
Allianz.Framework.Session.State.BusinessLayer.BLState.SaveNewState(State state) in
Извините за длинный рассказ и неопределенный вопрос, я буду очень признателен за любую помощь.