2010-04-26 5 views
6

Próbuję wyprowadzić klasę z ObservableCollection i potrzebuję uruchomić tylko jedną linię kodu za każdym razem, gdy jakakolwiek instancja tej klasy jest deserializowana. Myślałem o tym:Jak mogę uruchomić kod w definicji klasy C# za każdym razem, gdy jakakolwiek instancja klasy jest deserialized?

[Serializable] 
public class ObservableCollection2<T> : ObservableCollection<T>, ISerializable 
{ 
    public ObservableCollection2() 
     : base() 
    { } 

    public ObservableCollection2(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
     // Put additional code here. 
    } 

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     base.GetObjectData(info, context); 
    } 
} 

Ale nie mam dostępu do tych podstawowych metod związanych z serializacją. Czy jestem zmuszony ręcznie przepisać wszystkie serializacje?

+0

Powinieneś naprawdę wskazać * jak * serializujesz; istnieje wiele interfejsów API do szeregowania wbudowanego i 3rd party, a każdy z nich obsługuje różne wzorce/użycie. –

+0

Dobra uwaga. Korzystam z wbudowanej serializacji binarnej .NET. –

Odpowiedz

15

Można użyć OnDeserializedAttribute: "W przypadku zastosowania do metody, określa, że ​​metoda jest wywoływana natychmiast po deserializacji obiektu." Zauważ, że metoda musi również zaakceptować parametr StreamingContext:

[Serializable] 
public class ObservableCollection2<T>: ObservableCollection<T> 
{ 
    [OnDeserialized()] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     this.DateDeserialized = DateTime.Now; 
    } 
} 
+0

Dobra odpowiedź, ale przykład z kilkoma liniami nie zaszkodzi. –

+0

@Henk - w drodze! –

+0

Awesome! Dzięki! (P.S. Powinieneś usunąć ISerializable) –

Powiązane problemy