1

私は、世界トップの保険会社の 1 つで、控えめな C# プログラマーです。私は最近、巨大なソフトウェアを .Net Framework 4.0 で再コンパイルしました。
これは、何千ものオブジェクトを含む非常に大規模なビジネス ASP.Net アプリケーションです。これは、MemoryStream を使用してメモリ内でシリアライゼーション/デシリアライゼーションを使用して、アプリケーション (保険契約) の状態を複製し、それを他のモジュールに渡し、最後に保存します。
それは何年もの間うまくいきました。現在、体系的ではありませんが、BinaryFormatter.serialize が例外 Decimal byte array constructor requires an array of length 4 including valid decimal bytes. をスローすることがあります。患者の調査の後、担当分野を特定したところ、次のように宣言されています。

     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  
        }  
    }  
    .........  
}  

そして、セッターを通じて
myClass.UIDStampa = id;として初期化されます。この ID はプレーンな 10 進数です

まだ発見されていない理由から、この ID には明らかに有効な値がある場合があります。調べたり、クイックウォッチを使用すると、20000499428 という値が表示されますが、詳しく調べると、 20000499428 = {00000168 00000000 00000004 A81F66E4}
で形成されます 。 4 番目の数値である位取り 1 は無効ですが、小数の小数点には影響しません。連載までノークレーム。シリアライザーのみが苦情を言います。

プライベート変数を NOT NULLABLE として宣言するが、プレーン 10 進数を
プライベート 10 進数 uidStampa = 0M;として宣言するとします。
エラーは飲み込まれます。つまり、4 番目の数字が無効のまま残りますが、考慮されていないようです。

質問は次のとおりです。
なぜ BinaryFormatter.Serialize は、プライベート変数が nullable と宣言されているかどうかにかかわらず、パブリック変数がまだ nullable であると宣言されている場合に異なる動作をするのですか?
.Net 3.5 のシリアライザーの動作が異なりますか?
悪の根源、つまり無効な値が設定されているポイントを発見するには、C# でメモリをチェックするツールは何でしょうか?

提案をいただければ幸いです

マルコ

4

0 に答える 0