坚持C#中的序列化

Sco*_*ott 2 c# serialization binaryformatter

我有一个类在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;
    }
}    
Run Code Online (Sandbox Code Playgroud)

非常简单的东西,它适用于我的所有单元测试.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数是Manager类的一部分.Manager类在MainForm上实例化.MainForm使用SaveFileDialog提示用户输入要保存的文件名和位置,然后进行以下调用:

saveFileDialog.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath);
if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
{
    _manager.Save(saveFileDialog.FileName);
}
Run Code Online (Sandbox Code Playgroud)

因此调用上面的函数.当它这样做时,我在binaryFormatter.Serialize(stream,rulesManager)行的Serialize.SerializeRulesManager中得到以下异常:

在Assembly'TestHarness,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'中键入'TestHarness.MainForm'未标记为可序列化.

为什么需要将MainForm标记为Serializable?只是为了踢,我把Serializable属性放在MainForm上它只是将异常上移一级,说Windows.Form没有标记为Serializable.是什么赋予了?

Gre*_*ean 5

RulesManager可能引用了MainForm.如果是这样,请将其标记为未使用NonSerializedAttrbibute序列化