2009-10-01 49 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