2009-09-29 6 views
2

У меня есть класс, который обрабатывает сериализацию в C#, называемую Serializer. Это реализация ниже:Застрял на сериализации в C#

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

Довольно простая вещь, и это прекрасно работает со всеми моими модульными тестами. Регулятор правильно упорядочен и десериализован, поэтому я знаю, что график хорош.

Беда приходит со следующим кодом:

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 (поток, rulesManager) линия:

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

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

+0

вы можете поделиться реализации RulesManager –

+1

одна причина, чтобы не обойти ссылки на форму классов :) –

+0

Просто маленькое примечание: заменить Try /, наконец, блоки 'using() {}' блоков, где это возможно. Легче и надежнее. –

ответ

5

У RulesManager, вероятно, есть ссылка на MainForm. Если да, то отметьте его как не сериализовать с NonSerializedAttrbibute

+1

Ну, это то, что я получаю для публикации в конце рабочего дня вместо того, чтобы спать на нем. Я полностью упустил из виду событие, открытое RulesManager, к которому подключился MainForm. Четный не был отмечен как [field: NonSerializable], и ​​я не отключал событие в MainForm и поэтому пытался также сериализовать MainForm. Указание события как [поле: NonSerializable] устраняет проблему. – Scott