2009-09-29 26 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