我有一個在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。是什麼賦予了?
序列化可以分享的RulesManager – 2009-09-29 21:28:28
還有一個原因,執行不引用繞過你的表單類:) – 2009-09-29 21:31:15
只是一個小提示:用替換你的try/finally塊儘可能使用(){}'塊。更簡單,更可靠。 – 2009-09-29 21:52:49