繁体   English   中英

坚持使用C#进行序列化

[英]Stuck on Serialization in C#

我有一个在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,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”中的类型“ TestHarness.MainForm”未标记为可序列化。

为什么MainForm需要标记为Serializable? 只是为了踢一下,我将Serializable属性放在MainForm上,它只是将异常上移了一层,以表示Windows.Form未标记为Serializable。 是什么赋予了?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM