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/Transformers/Transformers.cs

    r15857 r15986  
    4848
    4949    public override object ToObject(Box box, Mapper mapper) {
    50       return Extract(box, (Type)mapper.GetObject(box.TypeBoxId), mapper);
     50      var type = (Type)mapper.GetObject(box.TypeBoxId);
     51      return type == null ? default(T) : Extract(box, type, mapper);
    5152    }
    5253
     
    8081        box.TypeId = mapper.GetTypeId(type);
    8182      }
    82 
    83       if (StorableTypeAttribute.IsStorableType(type))
    84         box.TypeVersion = StorableTypeAttribute.GetStorableTypeAttribute(type).Version;
    8583    }
    8684
    8785    public override object ToObject(Box box, Mapper mapper) {
    88       return Extract(box, mapper.GetType(box.TypeId), mapper);
     86      Type type;
     87      return mapper.TryGetType(box.TypeId, out type) ? Extract(box, type, mapper) : null;
    8988    }
    9089
    9190    private object Extract(Box box, Type type, Mapper mapper) {
    9291      if (type.IsGenericType) {
    93         return type.MakeGenericType(box.GenericTypeBoxIds.Select(x => (Type)mapper.GetObject(x)).ToArray());
     92        var genericArgumentTypes = box.GenericTypeBoxIds.Select(x => (Type)mapper.GetObject(x)).ToArray();
     93        return genericArgumentTypes.Any(x => x == null) ? null : type.MakeGenericType(genericArgumentTypes);
    9494      } else if (type == typeof(Array)) {
    95         return ((Type)mapper.GetObject(box.GenericTypeBoxIds[0])).MakeArrayType();
     95        var arrayType = (Type)mapper.GetObject(box.GenericTypeBoxIds[0]);
     96        return arrayType?.MakeArrayType();
    9697      } else {
    9798        return type;
     
    526527        var box = new Box {
    527528          TransformerId = mapper.GetTransformerId(this),
    528           TypeId = mapper.GetStringId(o.GetType().AssemblyQualifiedName),
    529           UInt = mapper.GetStringId(Enum.Format(o.GetType(), o, "G")),
     529          TypeBoxId = mapper.GetBoxId(o.GetType()),
     530          UInt = mapper.GetStringId(Enum.Format(o.GetType(), o, "G")) // TODO: introduce old names for enum values to enable refactoring
    530531        };
    531532        return box;
     
    533534
    534535      public override object ToObject(Box box, Mapper mapper) {
    535         return Enum.Parse(Type.GetType(mapper.GetString(box.TypeId)), mapper.GetString(box.UInt));
     536        var type = (Type)mapper.GetObject(box.TypeBoxId);
     537        return type == null ? null : Enum.Parse(type, mapper.GetString(box.UInt));
    536538      }
    537539    }
     
    784786    protected override void Populate(Box box, object value, Mapper mapper) {
    785787      var kvps = box.KeyValuePairs;
    786       var parentTypeVersions = box.UInts;
    787788      var emptyArgs = new object[0];
    788789
     
    815816        }
    816817
    817         if (type != originalType) {
    818           parentTypeVersions.AddRange(new[] { mapper.GetStringId(guid.ToString()), attribute.Version });
    819         }
    820 
    821818        type = type.BaseType;
    822819      }
     
    829826    public override void FillFromBox(object obj, Box box, Mapper mapper) {
    830827      var kvps = box.KeyValuePairs;
    831       var parentTypeVersions = box.UInts;
    832828      var emptyArgs = new object[0];
    833829
     
    840836
    841837      var type = (Type)mapper.GetObject(box.TypeBoxId);
    842       var typeBox = mapper.GetBox(box.TypeBoxId);
    843838      var typeInfo = Mapper.StaticCache.GetTypeInfo(type);
    844 
    845       var typeVersions = new List<Tuple<Guid, uint>>();
    846       typeVersions.Add(Tuple.Create(typeInfo.StorableTypeAttribute.Guid, typeBox.TypeVersion));
    847       for (int i = 0; i < parentTypeVersions.Count; i += 2)
    848         typeVersions.Add(Tuple.Create(Guid.Parse(mapper.GetString(parentTypeVersions[i])), parentTypeVersions[i + 1]));
    849 
    850       while (true) {
    851         var applicableConversion = Mapper.StaticCache.GetStorableConversions(typeVersions).FirstOrDefault();
    852         if (applicableConversion == null) break;
    853 
    854         Dictionary<string, object> newDict;
    855         List<Tuple<string, uint>> typeChain = null;
    856 
    857         var conversionParameters = applicableConversion.GetParameters();
    858         if (conversionParameters.Length == 1) {
    859           newDict = (Dictionary<string, object>)applicableConversion.Invoke(null, new object[] { dict });
    860         } else if (conversionParameters.Length == 2) {
    861           var parameters = new object[] { dict, typeChain };
    862           newDict = (Dictionary<string, object>)applicableConversion.Invoke(null, parameters);
    863           typeChain = (List<Tuple<string, uint>>)parameters[1];
    864         } else throw new PersistenceException("Conversion method has an invalid signature.");
    865 
    866         foreach (var kvp in newDict) dict[kvp.Key] = kvp.Value;
    867 
    868         var convertedType = StorableConversionAttribute.GetGuid(applicableConversion);
    869         var convertedVersion = StorableConversionAttribute.GetVersion(applicableConversion);
    870 
    871         var index = typeVersions.FindIndex(x => x.Item1 == convertedType);
    872         typeVersions.RemoveAt(index);
    873         typeVersions.Insert(index, Tuple.Create(convertedType, convertedVersion + 1));
    874 
    875         if (typeChain != null && typeChain.Any()) {
    876           typeVersions.RemoveRange(index + 1, typeVersions.Count - (index + 1));
    877           typeVersions.AddRange(typeChain.Select(x => Tuple.Create(Guid.Parse(x.Item1), x.Item2)));
    878         }
    879       }
    880 
    881839      var typeStack = new Stack<Tuple<Type, TypeInfo>>();
    882840
     
    905863        }
    906864
    907         // set all members as generated by conversion method chain
     865        // set all members
    908866        foreach (var kvp in dict) {
    909867          string key = kvp.Key;
     
    940898        //    typeInfo.StorableTypeAttribute.Version,
    941899        //    string.Join(", ", undefinedMembers.Select(x => x.Key))));
    942 
    943         foreach (var hook in typeInfo.AfterDeserializationHooks) {
    944           hook.Invoke(obj, emptyArgs);
    945         }
    946900      }
    947901    }
Note: See TracChangeset for help on using the changeset viewer.