c# - 为可序列化模型对象编写事件处理程序的正确方法是什么?

标签 c# events serialization .net-3.5

在序列化/反序列化时,我正在努力决定在 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] 方法需要做大量工作,所以我想先检查是否有替代解决方案。

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

最佳答案

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

例如(伪代码)

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; }
}

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

关于c# - 为可序列化模型对象编写事件处理程序的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30736885/

相关文章:

c# - 在 C# 中创建对象时订阅事件

c++ - 通过 eventFilter 获取 QLineEdit 的某些属性到剪贴板

serialization - JavaScriptSerializer 和 monodevelop

java - ObjectInputStream 给我一个空对象(但读取的文件不为空)

c# - 使用 C# 从 Visual Studio 下拉菜单中缺少控件

c# - 如何在 DataGrid 中设置 DisplayMemberPath?

c# - 如何让标签文字自动滚动?

events - 我应该允许插件使我的应用程序崩溃吗?