異なる .net フレームワーク (フレームワーク 2 および 4) でシリアライズおよびデシリアライズすると、非常に簡単に再現できるエラーがあります。フレームワーク 2 で System.Globalization.CompareInfo をシリアル化し、フレームワーク 4 で逆シリアル化しようとすると、OverflowException が発生します。コードは次のとおりです。
private void button1_Click(object sender, EventArgs e)
{
CompareInfo ci = CompareInfo.GetCompareInfo("de-DE");
Stream stream = File.Open("C:\\Temp\\test.bin", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
formatter.TypeFormat = System.Runtime.Serialization.Formatters.FormatterTypeStyle.XsdString;
formatter.Serialize(stream, ci);
stream.Close();
}
private void button2_Click(object sender, EventArgs e)
{
Stream stream = File.Open("C:\\Temp\\test.bin", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
CompareInfo ci = (CompareInfo)formatter.Deserialize(stream);
stream.Close();
}
同じバージョン (2 または 4) でこれを行うと、期待どおりに動作します。フレームワーク 2 でファイルを保存し、フレームワーク 4 で開こうとすると、OverflowException が発生します。現在、回避策を探しています (顧客にはフレームワーク 2.0 で書かれた何千ものファイルがあるため)。ISerializable インターフェイスとして機能するカスタム シリアル化属性を追加する方法のようなアプローチを試みましたが、成功しませんでした。何か案は?
申し訳ありませんが、コードがクラッシュする可能性がある 2 行を省略しました。
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
formatter.TypeFormat = System.Runtime.Serialization.Formatters.FormatterTypeStyle.XsdString;
必要ないと思ったからです。今、コードを更新しましたが、クラッシュしています。ファイルを読み取るときにこれらの行を含めることは役に立ちません。