Serializer と呼ばれる、C# でシリアル化を処理するクラスがあります。その実装は次のとおりです。
public class Serializer
{
public void SerializeRulesManager(string filename, RulesManager rulesManager)
{
Stream stream = File.Open(filename, FileMode.Create);
try
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(stream, rulesManager);
}
finally
{
stream.Close();
}
}
public RulesManager DeserializeRulesManager(string filename)
{
RulesManager rulesManager = null;
Stream stream = File.Open(filename, FileMode.Open);
try
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
rulesManager = (RulesManager)binaryFormatter.Deserialize(stream);
}
finally
{
stream.Close();
}
return rulesManager;
}
}
非常に簡単なもので、すべての単体テストで問題なく動作します。RulesManager は正しくシリアライズおよびデシリアライズされているため、グラフが適切であることがわかります。
問題は次のコードで発生します。
public void Save(string filename)
{
Cursor.Current = Cursors.WaitCursor;
try
{
_serializer.SerializeRulesManager(filename, _rulesManager);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
Cursor.Current = Cursors.Default;
}
}
その関数は Manager クラスの一部です。Manager クラスは MainForm でインスタンス化されます。MainForm は SaveFileDialog を使用して、保存先のファイル名と場所をユーザーに要求し、次の呼び出しを行います。
saveFileDialog.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath);
if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
{
_manager.Save(saveFileDialog.FileName);
}
したがって、上記の関数を呼び出します。そうすると、Serialize.SerializeRulesManager の binaryFormatter.Serialize(stream, rulesManager) 行で次の例外が発生します。
アセンブリ 'TestHarness, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' のタイプ 'TestHarness.MainForm' は、シリアル化可能としてマークされていません。
MainForm をシリアライズ可能としてマークする必要があるのはなぜですか? 念のため、MainForm に Serializable 属性を設定し、例外を 1 つ上のレベルに移動して、Windows.Form が Serializable としてマークされていないことを示しました。何を与える?