我有一个在 C# 中处理序列化的类,称为 Serializer。它的实现如下:
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);
}
从而调用上面的函数。当它这样做时,我在 binaryFormatter.Serialize(stream, rulesManager) 行的 Serialize.SerializeRulesManager 中得到以下异常:
在程序集“TestHarness,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”中键入“TestHarness.MainForm”未标记为可序列化。
为什么 MainForm 需要标记为可序列化?只是为了好玩,我将 Serializable 属性放在 MainForm 上,它只是将异常上移了一级,表明 Windows.Form 未标记为可序列化。是什么赋予了?