【发布时间】:2025-11-22 02:40:01
【问题描述】:
我正面临一个我无法识别的非常棘手的问题。
我正在运行一个包含数千个对象的非常大的业务 ASP.Net 应用程序;它通过 MemoryStream 使用内存中的序列化/反序列化来克隆应用程序的状态(保险合同)并将其传递给其他模块。多年来它工作得很好。现在有时,不是系统地,在序列化中它会抛出异常
十进制字节数组构造函数需要一个长度为四且包含有效十进制字节的数组。
使用相同的数据运行相同的应用程序,5 次中有 3 次有效。
我启用了所有 CLR 异常,调试 - 异常 - CLR 异常 - 已启用,
所以我猜如果发生错误的初始化/分配到十进制字段,程序应该停止。它不会发生。
我试图在更基本的对象中拆分序列化,但很难尝试识别导致问题的字段。
从生产中的工作版本和这个我从 .Net 3.5 传递到 .NET 4.0 的版本,对 UI 部分而不是业务部分进行了一致的更改。
我会耐心地完成所有的更改。
char *p 在不应该写入的地方看起来像老式的 C 问题,并且只有在序列化过程中检查所有数据时才会出现问题。
在 .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
对于长篇大论和未确定的问题,我将不胜感激。
【问题讨论】:
-
我遇到了同样的错误,原来是由联合引起的(使用 StructLayout(LayoutKind.Explicit) 我不小心将布尔解释为小数。应用程序的其余部分使用了小数作为正常的 0,但只有在单独的应用程序的反序列化过程中才会引发此错误,我通过在序列化之前执行 Decimal.GetBytes 并注意到倒数第三个字节是 1 而不是预期的 0 来意识到问题。
标签: c# asp.net serialization memory-management binaryformatter