私は、世界トップの保険会社の 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# でメモリをチェックするツールは何でしょうか?
提案をいただければ幸いです
マルコ