Застрял на сериализации в 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, культура = нейтральная, PublicKeyToken = null» не помечен как сериализуемый.

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


person Scott    schedule 29.09.2009    source источник
comment
можете поделиться реализацией RulesManager   -  person Greg Dean    schedule 30.09.2009
comment
Еще одна причина не передавать ссылки на ваши классы форм :)   -  person Ed S.    schedule 30.09.2009
comment
Небольшое примечание: по возможности замените блоки try/finally на блоки using() {}. Проще и надежнее.   -  person Henk Holterman    schedule 30.09.2009


Ответы (1)


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

person Greg Dean    schedule 29.09.2009
comment
Вот что я получаю за публикацию в конце рабочего дня вместо того, чтобы спать на ней. Я полностью упустил из виду событие, представленное RulesManager, к которому была подключена MainForm. Даже не было помечено как [field:NonSerializable], и ​​я не отцеплял событие в MainForm, поэтому он также пытался сериализовать MainForm. Пометка события как [field:NonSerializable] устранила проблему. - person Scott; 30.09.2009