- Timestamp:
- 09/12/11 10:12:50 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Core/DeSerializer.cs
r5445 r6737 32 32 /// instantiates objects and fills in values. 33 33 /// </summary> 34 public class Deserializer {34 public sealed class Deserializer { 35 35 36 36 /// <summary> … … 40 40 private class Midwife { 41 41 42 public string Name { get; private set; } 42 43 public int? Id { get; private set; } 43 44 public bool MetaMode { get; set; } … … 53 54 } 54 55 55 public Midwife(Type type, ICompositeSerializer compositeSerializer, int? id ) {56 public Midwife(Type type, ICompositeSerializer compositeSerializer, int? id, string name) { 56 57 this.type = type; 57 58 this.compositeSerializer = compositeSerializer; 58 59 this.Id = id; 60 this.Name = name; 59 61 MetaMode = false; 60 62 metaInfo = new List<Tag>(); … … 82 84 83 85 private readonly Dictionary<int, object> id2obj; 84 private readonly Dictionary<Type, object> serializerMapping;85 86 private readonly Stack<Midwife> parentStack; 86 private readonly Dictionary<int, Type> typeIds; 87 private Dictionary<Type, object> serializerInstances; 87 private ReverseTypeCache typeCache; 88 88 89 89 /// <summary> … … 93 93 /// </summary> 94 94 /// <param name="typeCache">The type cache.</param> 95 public Deserializer( 96 IEnumerable<TypeMapping> typeCache) {95 public Deserializer(ReverseTypeCache typeCache) { 96 this.typeCache = typeCache; 97 97 id2obj = new Dictionary<int, object>(); 98 98 parentStack = new Stack<Midwife>(); 99 typeIds = new Dictionary<int, Type>();100 serializerMapping = new Dictionary<Type, object>();101 serializerInstances = new Dictionary<Type, object>();102 foreach (var typeMapping in typeCache) {103 AddTypeInfo(typeMapping);104 }105 }106 107 /// <summary>108 /// Adds additionaly type information.109 /// </summary>110 /// <param name="typeMapping">The new type mapping.</param>111 public void AddTypeInfo(TypeMapping typeMapping) {112 if (typeIds.ContainsKey(typeMapping.Id))113 return;114 try {115 Type type = TypeLoader.Load(typeMapping.TypeName);116 typeIds.Add(typeMapping.Id, type);117 Type serializerType = TypeLoader.Load(typeMapping.Serializer);118 object serializer;119 if (serializerInstances.ContainsKey(serializerType)) {120 serializer = serializerInstances[serializerType];121 } else {122 serializer = Activator.CreateInstance(serializerType, true);123 serializerInstances.Add(serializerType, serializer);124 }125 serializerMapping.Add(type, serializer);126 } catch (PersistenceException) {127 throw;128 } catch (Exception e) {129 throw new PersistenceException(string.Format(130 "Could not add type info for {0} ({1})",131 typeMapping.TypeName, typeMapping.Serializer), e);132 }133 99 } 134 100 … … 157 123 } else if (t == typeof(TypeToken)) { 158 124 Type((TypeToken)token); 125 } else if (t == typeof(SerializerToken)) { 126 Serializer((SerializerToken)token); 159 127 } else { 160 128 throw new PersistenceException("invalid token type"); … … 173 141 174 142 private void Type(TypeToken token) { 175 AddTypeInfo(new TypeMapping(token.Id, token.TypeName, token.Serializer)); 143 typeCache.AddType(token.Id, TypeLoader.Load(token.TypeName)); 144 } 145 146 private void Serializer(SerializerToken token) { 147 typeCache.AddSerializer(token.Id, TypeLoader.Load(token.Serializer)); 176 148 } 177 149 178 150 private void CompositeStartHandler(BeginToken token) { 179 151 InstantiateParent(); 180 Type type = type Ids[(int)token.TypeId];152 Type type = typeCache.GetType(token.TypeId); 181 153 try { 182 parentStack.Push(new Midwife(type, (ICompositeSerializer)serializerMapping[type], token.Id));154 parentStack.Push(new Midwife(type, typeCache.GetCompositeSerializer(token.TypeId), token.Id, token.Name)); 183 155 } catch (Exception e) { 184 156 if (e is InvalidCastException || e is KeyNotFoundException) { … … 195 167 196 168 private void CompositeEndHandler(EndToken token) { 197 Type type = typeIds[(int)token.TypeId];198 169 Midwife midwife = parentStack.Pop(); 199 170 if (midwife.Obj == null) 200 171 CreateInstance(midwife); 201 172 midwife.Populate(); 202 SetValue( token.Name, midwife.Obj);173 SetValue(midwife.Name, midwife.Obj); 203 174 } 204 175 205 176 private void PrimitiveHandler(PrimitiveToken token) { 206 Type type = typeIds[(int)token.TypeId];207 177 try { 208 object value = ((IPrimitiveSerializer)serializerMapping[type]).Parse(token.SerialData);178 object value = typeCache.GetPrimitiveSerializer(token.TypeId).Parse(token.SerialData); 209 179 if (token.Id != null) 210 180 id2obj[(int)token.Id] = value; … … 214 184 throw new PersistenceException(String.Format( 215 185 "Invalid primitive serializer configuration for type \"{0}\".", 216 type .AssemblyQualifiedName), e);186 typeCache.GetType(token.TypeId).AssemblyQualifiedName), e); 217 187 } else { 218 188 throw new PersistenceException(String.Format( 219 189 "Unexpected exception while trying to parse object of type \"{0}\".", 220 type .AssemblyQualifiedName), e);190 typeCache.GetType(token.TypeId).AssemblyQualifiedName), e); 221 191 } 222 192 }
Note: See TracChangeset
for help on using the changeset viewer.