c# - 陷入 C# 序列化困境

标签 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;
    }
}    

非常简单的东西,它适用于我所有的单元测试。 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) 行中收到以下异常:

Type 'TestHarness.MainForm' in Assembly 'TestHarness, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

为什么需要将 MainForm 标记为可序列化?只是为了好玩,我将 Serialized 属性放在 MainForm 上,它只是将异常向上移动了一级,表明 Windows.Form 未标记为 Serialized。给出了什么?

最佳答案

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

关于c# - 陷入 C# 序列化困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1495025/

相关文章:

java - MapFunction 的实现不可序列化 Flink

android - 在 Android 中存储字符串的最有效方式

c# - Binaryformatter 序列化中的十进制字节数组构造函数

c# - 编写需要嵌入加密数据库的 C# 桌面应用程序。我应该使用什么类型的数据库?

c# - ASP.NET 将所有文件下载为 Zip

c# - NHibernate:如何在没有延迟加载的情况下通过一个 sql 查询急切地获取带有子实体过滤器的子实体?

java - 映射 JavaRDD 时获取 java.io.NotSerializableException

c# - 如何获取当前请求的域名?

c# - BinaryFormatter 字节顺序

.net - 如何重构在 .NET 中序列化的类?