Существует ли событие OnDeserialized или подобно, таким образом, я могу решить, что класс был десериализован?

У меня есть базовый класс для всех моих пользовательских наборов объекта, простая версия его - это:

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

Но, я не могу предположить, что это - первый раз, когда кто-либо столкнулся с этой проблемой, так есть ли лучшая альтернатива?

5
задан djdd87 8 June 2010 в 16:12
поделиться

2 ответа

Да, вы можете добавить в свой класс метод со специальным атрибутом и правильной подписью:

[OnDeserializedAttribute()]
private void RunThisMethod(StreamingContext context)
{ 
    // post-serialize your class
}
5
ответ дан 14 December 2019 в 13:27
поделиться

Попробуйте http://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializingattribute.aspx и эквивалентный OnDeserializedAttribute

1
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: