У меня возникла очень неприятная проблема, которую я не могу определить.
Я запускаю очень большое приложение ASP.Net для бизнеса, содержащее много тысяч объектов; Он использует сериализацию/десериализацию в памяти с MemoryStream для клонирования состояния приложения (договоров страхования) и передачи его другим модулям. Он работал отлично в течение многих лет. Теперь иногда систематически не, в сериализации он бросает исключениеКонструктор десятичного байтового массива в Binaryformatter Serialization
Десятичного конструктор байтового массива требует массива длины четыре, содержащих действительные десятичных байты.
Запуск того же приложения с теми же данными, 3 раза из 5 он работает. Я включил все исключения CLR, Debug - Исключения - исключение CLR - включено, , поэтому я предполагаю, что если произойдет неправильная инициализация/назначение в десятичное поле, программа должна остановиться. Этого не происходит.
Я попытался разделить сериализацию на более элементарные объекты, но это очень сложно, чтобы попытаться определить поле, вызывающее проблему. Из рабочей версии в производстве и этого я передал от .Net 3.5 до .NET 4.0 и были сделаны последовательные изменения в части пользовательского интерфейса, а не в бизнес-части. Терпеливо я пройду все изменения.
Это похоже на старомодные проблемы C, когда char *p
пишет, где это не должно быть, и только в процессе сериализации, когда он анализирует все данные, проблема вылетает.
Возможно ли это в управляемой среде .Net? Приложение огромно, но я не вижу аномальных темпов памяти. Что может быть способом отладки и отслеживания проблемы?
Ниже часть StackTrace
[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
Извините за длинную историю и неопределенном вопрос, я буду очень признателен за любую помощь.
Я столкнулся с той же ошибкой, это оказалось вызвано объединением (используя StructLayout (LayoutKind.Explicit) w здесь я интерпретировал bool как десятичное случайно. Остальная часть приложения использовала десятичное значение как нормальное значение 0, но только во время десериализации в отдельном приложении он бы выбросил эту ошибку, я понял проблему, выполнив Decimal.GetBytes до сериализации и заметив, что третий-последний байт был 1 вместо 0 как и следовало ожидать. – BrandonAGr