我是世界顶级保险公司之一的C#程序员。我最近用.Net framework 4.0重新编译了一个庞大的软件
这是一个非常大的业务ASP.Net应用程序,包含数千个对象;它使用MemoryStream在内存中进行序列化/反序列化来克隆应用程序的状态(保险合同)并将其传递给其他模块并将其保存在最后。
它运作良好多年。现在有时候,不是系统地,BinaryFormatter.serialize会抛出异常
十进制字节数组构造函数需要一个包含有效十进制字节的长度为4的数组。
在患者搜索后我确定了负责的字段,其声明如下:
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显然具有有效值:
如果我查看它或使用快速表,我会看到值20000499428,
而如果我仔细检查它是由形成的
20000499428 = {00000168 00000000 00000004 A81F66E4}
所以第四个数字,即第一个数字,虽然它不影响小数的小数点,但是无效。在序列化之前没有投诉。只有串行器投诉。
如果我将私有变量声明为NOT NULLABLE而将纯十进制声明为
private decimal uidStampa = 0M;
吞下错误,我的意思是它仍然是第四个数字无效,但看起来它没有被考虑。
问题是:
为什么BinaryFormatter.Serialize在私有变量被声明为可为空的情况下表现不同而且公共变量仍然可以为空?
.Net 3.5的序列化程序表现不同?
要发现邪恶的根源,那么设置无效值的点,可以用什么来检查C#中的内存?
我会感激任何建议
Marco