【问题标题】:What is the correct way to code event handlers for serializable model objects?为可序列化模型对象编写事件处理程序的正确方法是什么?
【发布时间】:2015-08-24 13:22:01
【问题描述】:

在序列化/反序列化时,我正在努力确定在 MVP 模式中处理模型级事件的“正确”方式。

例如,假设我的可序列化基模型类中有一个 PropertyChanged 事件处理程序:

[Serializable]
public abstract class MyBaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

子类可能使用也可能不使用事件处理程序

[Serializable]
public class MyModel
{
    public MyModel()
    {
        PropertyChanged += MyModel_PropertyChanged;
    }
}

并且不可序列化的 Presenters/ViewModels 也可以使用这个事件处理程序

public class MyPresenter
{
    public MyPresenter(MyModel m)
    {
        m.PropertyChanged += MyPresenter_PropertyChanged;
    }
}

我的问题是当我尝试使用序列化克隆模型对象时,我得到一个异常,因为MyPresenter 没有被标记为可序列化。

这可以通过将[NonSerialized] 属性添加到PropertyChanged 事件来轻松解决,但是当对象被反序列化时,它们也缺少MyModel_PropertyChanged 处理程序,该处理程序仅在构造函数中添加。

我正在考虑在模型中使用[OnDeserialized] 方法,并在那里附加模型级事件处理程序,但是我正在使用的代码库非常大,需要做很多工作每个或模型库,并为每个库添加自定义[OnDeserialized] 方法,所以我想先检查是否有替代解决方案。

有没有办法指定哪些事件处理程序不被序列化?或者更好地解决如何处理可序列化对象中的事件处理程序的问题,对象本身和不可序列化对象都可以使用?

【问题讨论】:

    标签: c# events serialization .net-3.5


    【解决方案1】:

    嗯..只是一个快速的答案 基本上有一些附加这个事件的逻辑 所以你应该客观化这个逻辑

    例如(伪代码)

    class MyHandlingLogic : IDisposable
     Target { get; set; }
     RegistrationDelegate { get; set; }
     OnTargetSet(target) { 
       this.RegistrationDelegate = ...; // some code utilizing all properties set
       target.TargetEvent += this.RegistrationDelegate; 
     }
     Dispose() { target.TargetEvent -= this.RegistrationDelegate; }
    }
    

    您可以将此逻辑作为一个对象并将其托管在正在注册此的对象(页面或控制器状态等)中,因此您可以通过这种方式序列化所需事物的部分(引用)要恢复的逻辑..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多