我的所有自定义实体集合都有一个基类,它的简单版本就是:
[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();
}
}
集合位于Session
中的序列化类中(即会话中的Customer类具有Order实体的集合)。问题是我的实体基类的MadeDirty事件如下:
[field: NonSerialized()]
public event EventHandler MadeDirty;
不幸的是,我不能只删除事件上的NonSerialized
属性,因为这会在部署到我的应用程序服务器时导致会话状态服务器出现问题。
有没有办法可以在CollectionBase上捕获反序列化的完成事件,这样我就可以遍历所有项目,并在Session的每个反序列化中重新分配MadeDirty
事件?即。
private void OnDeserialized(object sender, EventArgs e)
{
foreach (T item in this)
{
item.MadeDirty+= new EventHandler(item_MadeDirty);
}
}
但是,我无法想象这是第一次有人遇到这个问题,那么还有更好的选择吗?
答案 0 :(得分:5)
是的,您可以为您的班级添加一个special attribute和正确签名的方法:
[OnDeserializedAttribute()]
private void RunThisMethod(StreamingContext context)
{
// post-serialize your class
}
答案 1 :(得分:1)
尝试http://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializingattribute.aspx和等效的OnDeserializedAttribute