Używam prostej klasy, która jest serializowalna. Ma konstruktora do deserializacji:.NET Deserializacja z OnDeserializing i OnDeserialized
protected MyClass(SerializationInfo info, StreamingContext context)
i metody GetObjectData do serializacji. To działa dobrze.
Teraz dodałem dwie metody monitorowania deserialisation:
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context)
{
System.Diagnostics.Trace.WriteLine("OnDeserializingMethod: " + this.GetType().ToString());
}
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
System.Diagnostics.Trace.WriteLine("OnDeserializedMethod: " + this.GetType().ToString());
}
i zastanawiałem się, w jakiej kolejności te metody są beeing nazywa. Teraz obie metody są wywoływane przed wywołaniem konstruktora. Jak to możliwe i dlaczego nie jest wywoływana metoda "OnDeserialized" po wywołaniu konstruktora (deserialization-)? Jak można wywołać metodę (niestatyczną) przed wykonaniem dowolnego konstruktora? (Podaję się BinaryFormatter)
ten kod wywoła obiekt constuctor var ctor = obj.GetType(). GetConstructor (.... Użyłbym InvokeMember do wywołania metody http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A -Method-Given-Strings-with-Met –
Dzięki, perfekcyjna odpowiedź, oznaczy ją jako zaakceptowaną po tym, jak dowiedziałem się, dlaczego w moim scenariuszu ctor zostaje wywołany jako ostatni. Może dlatego, że obiekt nie jest korzeniem zserializowanego drzewa – Gerhard
OK Marc, twoja odpowiedź jest poprawna tylko dla obiektu root.Zobacz moją odpowiedź poniżej dla bardziej złożonego scenariusza.Wszelkie powody, dlaczego zachowuje się w ten sposób? Nawiasem mówiąc: bardzo fajne [CallerMemberName] Atrybut! Nie wiedziałem, że wcześniej (ale tylko .NET 4.5) – Gerhard