2009-09-29 78 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; 
    } 
}  

非常简单的东西,它适用于我所有的单元测试。 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类在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

类型 'TestHarness.MainForm',版本= 1.0.0.0,文化=中立,PublicKeyToken = null'未标记为可序列化。

为什么MainForm需要标记为Serializable?只是为了踢,我把Serializable属性放在MainForm上,它只是把异常移到了一个级别,以表明Windows.Form没有标记为Serializable。是什么赋予了?

+0

序列化可以分享的RulesManager – 2009-09-29 21:28:28

+1

还有一个原因,执行不引用绕过你的表单类:) – 2009-09-29 21:31:15

+0

只是一个小提示:用替换你的try/finally块尽可能使用(){}'块。更简单,更可靠。 – 2009-09-29 21:52:49

回答

5

RulesManager可能具有对MainForm的引用。如果是这样,将其标记为不与 NonSerializedAttrbibute

+1

那么这就是我在工作日结束时发布的内容,而不是睡在它上面。我完全忽略了RulesManager公布的MainForm被钩住的事件。偶没有标记为[field:NonSerializable],我没有在MainForm中解除事件,所以它也试图序列化MainForm。 将事件标记为[field:NonSerializable]解决了该问题。 – Scott 2009-09-30 02:45:31