Changeset 15986 for branches/PersistenceReintegration/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs
- Timestamp:
- 07/05/18 17:22:34 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PersistenceReintegration/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs
r15857 r15986 48 48 49 49 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); 51 52 } 52 53 … … 80 81 box.TypeId = mapper.GetTypeId(type); 81 82 } 82 83 if (StorableTypeAttribute.IsStorableType(type))84 box.TypeVersion = StorableTypeAttribute.GetStorableTypeAttribute(type).Version;85 83 } 86 84 87 85 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; 89 88 } 90 89 91 90 private object Extract(Box box, Type type, Mapper mapper) { 92 91 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); 94 94 } 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(); 96 97 } else { 97 98 return type; … … 526 527 var box = new Box { 527 528 TransformerId = mapper.GetTransformerId(this), 528 Type Id = 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 530 531 }; 531 532 return box; … … 533 534 534 535 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)); 536 538 } 537 539 } … … 784 786 protected override void Populate(Box box, object value, Mapper mapper) { 785 787 var kvps = box.KeyValuePairs; 786 var parentTypeVersions = box.UInts;787 788 var emptyArgs = new object[0]; 788 789 … … 815 816 } 816 817 817 if (type != originalType) {818 parentTypeVersions.AddRange(new[] { mapper.GetStringId(guid.ToString()), attribute.Version });819 }820 821 818 type = type.BaseType; 822 819 } … … 829 826 public override void FillFromBox(object obj, Box box, Mapper mapper) { 830 827 var kvps = box.KeyValuePairs; 831 var parentTypeVersions = box.UInts;832 828 var emptyArgs = new object[0]; 833 829 … … 840 836 841 837 var type = (Type)mapper.GetObject(box.TypeBoxId); 842 var typeBox = mapper.GetBox(box.TypeBoxId);843 838 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 881 839 var typeStack = new Stack<Tuple<Type, TypeInfo>>(); 882 840 … … 905 863 } 906 864 907 // set all members as generated by conversion method chain865 // set all members 908 866 foreach (var kvp in dict) { 909 867 string key = kvp.Key; … … 940 898 // typeInfo.StorableTypeAttribute.Version, 941 899 // string.Join(", ", undefinedMembers.Select(x => x.Key)))); 942 943 foreach (var hook in typeInfo.AfterDeserializationHooks) {944 hook.Invoke(obj, emptyArgs);945 }946 900 } 947 901 }
Note: See TracChangeset
for help on using the changeset viewer.