Changeset 3031 for trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
- Timestamp:
- 03/15/10 12:25:55 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
r3029 r3031 43 43 44 44 public IEnumerable<Tag> CreateMetaInfo(object o) { 45 StorableHookAttribute.InvokeHook(HookType.BeforeSerialization, o);45 InvokeHook(HookType.BeforeSerialization, o); 46 46 return new Tag[] { }; 47 47 } … … 79 79 } 80 80 } 81 StorableHookAttribute.InvokeHook(HookType.AfterDeserialization, instance);81 InvokeHook(HookType.AfterDeserialization, instance); 82 82 } 83 83 … … 89 89 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 90 90 91 private static readonly object[] emptyArgs = new object[] { }; 92 91 93 private sealed class TypeQuery { 92 94 public Type Type { get; private set; } … … 95 97 this.Type = type; 96 98 this.Inherited = inherited; 99 } 100 } 101 102 private sealed class HookDesignator { 103 public Type Type { get; set; } 104 public HookType HookType { get; set; } 105 public HookDesignator() { } 106 public HookDesignator(Type type, HookType hookType) { 107 Type = type; 108 HookType = HookType; 97 109 } 98 110 } … … 107 119 private Dictionary<Type, ConstructorInfo> constructorCache = 108 120 new Dictionary<Type, ConstructorInfo>(); 121 122 private Dictionary<HookDesignator, List<MethodInfo>> hookCache = 123 new Dictionary<HookDesignator, List<MethodInfo>>(); 109 124 110 125 #endregion … … 150 165 } 151 166 167 private void InvokeHook(HookType hookType, object obj) { 168 if (obj == null) 169 throw new ArgumentNullException("Cannot invoke hooks on null"); 170 foreach (MethodInfo mi in GetHooks(hookType, obj.GetType())) { 171 mi.Invoke(obj, emptyArgs); 172 } 173 } 174 175 private IEnumerable<MethodInfo> GetHooks(HookType hookType, Type type) { 176 lock (hookCache) { 177 List<MethodInfo> hooks; 178 var designator = new HookDesignator(type, hookType); 179 hookCache.TryGetValue(designator, out hooks); 180 if (hooks != null) 181 return hooks; 182 hooks = new List<MethodInfo>(StorableReflection.CollectHooks(hookType, type)); 183 hookCache.Add(designator, hooks); 184 return hooks; 185 } 186 } 187 152 188 #endregion 189 190 153 191 154 192 }
Note: See TracChangeset
for help on using the changeset viewer.