У меня есть базовый класс для всех моих пользовательских наборов объекта, простая версия его - это:
[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
(т.е. Клиентский класс на сессии имеет набор объектов Порядка). Проблема состоит в том, что мое событие MadeDirty базового класса объекта следующие:
[field: NonSerialized()]
public event EventHandler MadeDirty;
К сожалению, я не могу просто удалить NonSerialized
атрибут на событии, потому что это вызывает проблемы в сервере состояния сеанса при развертывании на моем сервере приложений.
Есть ли любой способ, которым я могу получить десериализованное событие завершения на CollectionBase, таким образом, я могу выполнить итерации через все объекты и повторно присвоиться MadeDirty
событие на каждой десериализации от Сессии? Т.е.
private void OnDeserialized(object sender, EventArgs e)
{
foreach (T item in this)
{
item.MadeDirty+= new EventHandler(item_MadeDirty);
}
}
Но, я не могу предположить, что это - первый раз, когда кто-либо столкнулся с этой проблемой, так есть ли лучшая альтернатива?
Да, вы можете добавить в свой класс метод со специальным атрибутом и правильной подписью:
[OnDeserializedAttribute()]
private void RunThisMethod(StreamingContext context)
{
// post-serialize your class
}
Попробуйте http://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializingattribute.aspx и эквивалентный OnDeserializedAttribute