我是世界顶级保险公司之一的普通 C# 程序员。我最近用 .Net framework 4.0 重新编译了一个巨大的软件。
这是一个非常大的业务 ASP.Net 应用程序,包含数千个对象;它通过 MemoryStream 在内存中使用序列化/反序列化来克隆应用程序的状态(保险合同)并将其传递给其他模块并在最后保存。
多年来它工作得很好。现在有时,不是系统地,BinaryFormatter.serialize 抛出异常十进制字节数组构造函数需要一个长度为四的数组,其中包含有效的十进制字节。经过患者搜索,我确定了负责的领域,声明如下:
public class myClass
{
.......
private decimal? uidStampa = null;
public decimal? UIDStampa
{
get
{
if (uidStampa == null)
{
uidStampa = Convert.ToDecimal(strdoc.Substring(5));
}
return uidStampa;
}
set
{
uidStampa = value;
decimal d = (decimal)uidStampa; // NO Complaint
d.SanityCheck("_idstampa set"); //my method to check bits of the decimal
}
}
.........
}
它通过 setter 初始化为
myClass.UIDStampa = id; 这个 id 是一个普通的十进制数
有时由于尚未发现的原因,这个 id 显然有一个有效值:如果我检查它或使用 quickwatch,我会看到值 20000499428,
而如果我仔细检查它,它是由
20000499428 = {00000168 00000000 00000004 A81F66E4}
形成的第四个数字,小数位数,虽然不影响小数点的小数点,但无效。在连载之前没有任何投诉。只有序列化程序投诉。
如果我将私有变量声明为 NOT NULLABLE 但将纯十进制声明为
私有十进制 uidStampa = 0M;
错误被吞下,我的意思是第四个数字仍然无效,但看起来它没有被考虑。
问题是:
为什么 BinaryFormatter.Serialize 的行为会有所不同,如果私有变量被声明为可以为空,而公共变量仍然可以为空?
.Net 3.5 的序列化程序表现不同?
为了发现邪恶的根源,设置无效值的点,有什么工具可以在 C# 中检查内存?
我会很感激任何建议
马可