Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/05/18 17:22:34 (6 years ago)
Author:
jkarder
Message:

#2520: worked on new persistence

  • removed type version
  • removed conversions
  • execute AfterDeserialization hooks after all objects have been populated
  • worked on transformers
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PersistenceReintegration/HeuristicLab.Persistence/4.0/Core/Mapper.cs

    r15529 r15986  
    9393    public Type GetType(uint typeId) {
    9494      return types.GetValue(typeId);
     95    }
     96
     97    public bool TryGetType(uint typeId, out Type type) {
     98      return types.TryGetValue(typeId, out type);
    9599    }
    96100    #endregion
     
    132136        o = transformer.ToObject(box, this);
    133137        boxId2Object.Add(boxId, o);
    134         transformer.FillFromBox(o, box, this);
     138        if (o != null) transformer.FillFromBox(o, box, this);
    135139      }
    136140
     
    176180      mapper.strings = new Index<string>(bundle.Strings);
    177181
    178       return mapper.GetObject(bundle.RootBoxId);
     182      var root = mapper.GetObject(bundle.RootBoxId);
     183
     184      ExecuteAfterDeserializationHooks(mapper.boxId2Object.Values.ToArray());
     185
     186      return root;
     187    }
     188
     189    private static void ExecuteAfterDeserializationHooks(object[] objects) {
     190      var emptyArgs = new object[0];
     191
     192      foreach (var obj in objects) {
     193        if (!StorableTypeAttribute.IsStorableType(obj.GetType())) continue; // TODO: performance
     194
     195        var typeStack = new Stack<Type>();
     196        for (var type = obj.GetType(); type != null; type = type.BaseType) {
     197          typeStack.Push(type);
     198        }
     199
     200        while (typeStack.Any()) {
     201          var type = typeStack.Pop();
     202          if (!StorableTypeAttribute.IsStorableType(type)) continue; // object <- mytype (has hooks) or object <- valuetype <- mystruct
     203
     204          var typeInfo = staticCache.GetTypeInfo(type);
     205          foreach (var hook in typeInfo.AfterDeserializationHooks) {
     206            hook.Invoke(obj, emptyArgs);
     207          }
     208        }
     209      }
    179210    }
    180211  }
Note: See TracChangeset for help on using the changeset viewer.