2010-06-08 3 views
4

J'ai une classe de base pour toutes mes collections d'entités personnalisées, une version simple est la suivante:Y a-t-il un événement OnDeserialized ou similaire afin que je puisse déterminer qu'une classe a été désérialisée?

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

} 

Les collections sont assis dans une classe sérialisée qui se trouve dans Session (c.-à-classe client en session a une collection d'entités de commande). Le problème est que l'événement MadeDirty de ma classe de base de l'entité est la suivante:

[field: NonSerialized()] 
public event EventHandler MadeDirty; 

Malheureusement, je ne peux pas simplement supprimer l'attribut NonSerialized sur l'événement, car cela provoque des problèmes dans le serveur d'état de session lorsqu'il est déployé sur mon serveur d'applications.

Est-il possible de capturer un événement d'achèvement désérialisé sur CollectionBase afin que je puisse parcourir tous les éléments et réaffecter l'événement MadeDirty à chaque désérialisation de la session? C'est à dire. Mais, je ne peux pas m'imaginer que ce soit la première fois que quelqu'un rencontre ce problème, alors existe-t-il une meilleure alternative?

Répondre

4

Oui, vous pouvez ajouter une méthode avec un special attribute et la signature directement à votre classe:

[OnDeserializedAttribute()] 
private void RunThisMethod(StreamingContext context) 
{ 
    // post-serialize your class 
} 
+0

Merci beaucoup Henk. Spot sur! – GenericTypeTea