代码之家  ›  专栏  ›  技术社区  ›  Daniel MoÅ¡mondor

二进制格式化程序接收事件

  •  1
  • Daniel MoÅ¡mondor  · 技术社区  · 15 年前

    我有一个存储类,它有向其中添加项的事件。我的窗体类处理该事件。当我尝试序列化它时,格式化程序抱怨窗体类没有标记为可序列化。当然,我不想序列化它,但是,我不能将事件标记为[非序列化],因为它不是字段…

    怎么办?

    编辑:其他信息:

    我尝试了两个匿名代码块:

    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();
    }
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Ian Ringrose    15 年前

    使您的活动 NonSerializedAttribute . 但是,要使其正常工作,您需要告诉编译器将属性放在backing字段上,而不是放在它自己的事件上。

    [field:NonSerialized()] 
    public event ChangedEventHandler OnAdded;
    
        2
  •  1
  •   Mark Seemann    15 年前

    存储类通过事件保存对窗体的引用,因此格式化程序尝试序列化窗体,因为它是存储类状态的一部分。

    在序列化表单之前,尝试从事件中取消订阅该表单,然后在序列化后立即重新订阅。

        3
  •  1
  •   Patrik Svensson Martin Ender    15 年前

    也许您可以实现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
    }