1

我是世界顶级保险公司之一的普通 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# 中检查内存?

我会很感激任何建议

马可

4

0 回答 0