У меня есть класс, который обрабатывает сериализацию в 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. Что дает?
вы можете поделиться реализации RulesManager –
одна причина, чтобы не обойти ссылки на форму классов :) –
Просто маленькое примечание: заменить Try /, наконец, блоки 'using() {}' блоков, где это возможно. Легче и надежнее. –