Застрял на сериализации в 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);
}

Таким образом вызывая функцию выше. Когда это происходит, я получаю следующее исключение в Serialize.SerializeRulesManager в строке binaryFormatter.Serialize(stream, rulesManager):

Тип "TestHarness.MainForm" в сборке "TestHarness, версия =1.0.0.0, Culture= нейтральный, PublicKeyToken=null" не помечен как сериализуемый.

Почему MainForm должен быть отмечен как Serializable? Просто для удовольствия я поместил атрибут Serializable в MainForm, и он просто переместил исключение на один уровень, чтобы сказать, что Windows.Form не был помечен как Serializable. Что дает?

1 ответ

Решение

RulesManager, вероятно, имеет ссылку на MainForm. Если это так, пометьте его как не сериализованный с помощью NonSerializedAttrbibute

Другие вопросы по тегам