2009-10-01 71 views
1

我有一個存儲類,它有添加項目的事件。我的表單類處理事件。當我嘗試序列化它時,格式化程序抱怨未標記爲可序列化的表單類。當然,我不想序列化它,但是,我不能將事件標記爲[NonSerialize],因爲它不是字段...BinaryFormatter拾取事件

怎麼辦?

編輯:aditional的信息:

我試過匿名代碼塊:

Storage.Instance.AllPartners.OnAdded += 
    new Partners.Added(delegate(Partner p) { 
     viewPartners.RefreshData(); 
    }); 

和事件處理程序員:

Storage.Instance.AllPartners.OnAdded += new Partners.Added(AllPartners_OnAdded); 

void AllPartners_OnAdded(Partner partner) 
{ 
    viewPartners.RefreshData(); 
} 

回答

1

讓您的活動與NonSerializedAttribute。然而爲了使這個工作正常,你需要告訴編譯器將屬性放在支持字段上,而不是它自己的事件。

[field:NonSerialized()] 
public event ChangedEventHandler OnAdded; 
+0

它是否適用於.net 2.0? – 2009-10-25 12:27:32

+0

@Daniel,這已經工作,因爲.net 1.0 – 2009-10-25 21:03:03

+0

這工程太棒了! – 2010-01-02 11:09:40

1

也許你可以實現ISerializable接口。

public class MyClass : ISerializable 
{ 
    private int m_shouldBeSerialized; 
    private int m_willNotBeSerialized; 

    protected MyClass(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("MyValue", m_shouldBeSerialized); 
    } 

    #region ISerializable Members 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     m_shouldBeSerialized = info.GetInt32("MyValue"); 
    } 

    #endregion 
} 
+0

好主意,但我想更便宜的解決方案...... – 2009-10-01 10:51:35

1

你的存儲類保持通過對該事件的引用到您的表單,所以格式化試圖序列的形式,因爲它是存儲類的狀態的一部分。

嘗試在序列化前從事件中取消訂閱表單,然後在序列化後立即重新訂閱。

+0

第一個事實是顯而易見的,但我想去便宜那麼你的解決方案 - 這是完全確定。 – 2009-10-01 10:50:43