是否有OnDeserialized事件或类似事件,以便我可以确定一个类已被反序列化?

djd*_*d87 5 c# asp.net serialization

我的所有自定义实体集合都有一个基类,它的简单版本如下:

[Serializable]
public class CollectionBase<T> : List<T> where T : IEntity
{

    public bool IsDirty {get;}

    public new void Add(T item)
    {
        this.SetDirty();
        base.Add(item);
        item.MadeDirty += new EventHandler(item_MadeDirty);
    }

    // Other standard list methods overridden here
    ...

    public void SetDirty() { } // Mark the collection as dirty

    private void item_MadeDirty(object sender, EventArgs e)
    {
        this.SetDirty();
    }

}
Run Code Online (Sandbox Code Playgroud)

集合位于一个序列化的类中Session(即,会话中的Customer类具有Order实体的集合).问题是我的实体基类的MadeDirty事件如下:

[field: NonSerialized()]
public event EventHandler MadeDirty;
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不能只删除NonSerialized事件上的属性,因为这会在部署到我的应用程序服务器时导致会话状态服务器出现问题.

有没有什么办法可以在CollectionBase上捕获反序列化的完成事件,这样我就可以遍历所有项目并MadeDirty从Session 重新分配每个反序列化的事件?即

private void OnDeserialized(object sender, EventArgs e)
{
   foreach (T item in this)
   {
      item.MadeDirty+= new EventHandler(item_MadeDirty);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法想象这是第一次有人遇到这个问题,那么还有更好的选择吗?

Hen*_*man 5

是的,您可以为您的类添加一个具有特殊属性和正确签名的方法:

[OnDeserializedAttribute()]
private void RunThisMethod(StreamingContext context)
{ 
    // post-serialize your class
}
Run Code Online (Sandbox Code Playgroud)