Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/12/11 10:12:50 (13 years ago)
Author:
epitzer
Message:

#1530 Split type and serializer tokens and include special handling for CachedTypeSerializer (this should also fix #1527)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Core/DeSerializer.cs

    r5445 r6737  
    3232  /// instantiates objects and fills in values.
    3333  /// </summary>
    34   public class Deserializer {
     34  public sealed class Deserializer {
    3535
    3636    /// <summary>
     
    4040    private class Midwife {
    4141
     42      public string Name { get; private set; }
    4243      public int? Id { get; private set; }
    4344      public bool MetaMode { get; set; }
     
    5354      }
    5455
    55       public Midwife(Type type, ICompositeSerializer compositeSerializer, int? id) {
     56      public Midwife(Type type, ICompositeSerializer compositeSerializer, int? id, string name) {
    5657        this.type = type;
    5758        this.compositeSerializer = compositeSerializer;
    5859        this.Id = id;
     60        this.Name = name;
    5961        MetaMode = false;
    6062        metaInfo = new List<Tag>();
     
    8284
    8385    private readonly Dictionary<int, object> id2obj;
    84     private readonly Dictionary<Type, object> serializerMapping;
    8586    private readonly Stack<Midwife> parentStack;
    86     private readonly Dictionary<int, Type> typeIds;
    87     private Dictionary<Type, object> serializerInstances;
     87    private ReverseTypeCache typeCache;
    8888
    8989    /// <summary>
     
    9393    /// </summary>
    9494    /// <param name="typeCache">The type cache.</param>
    95     public Deserializer(
    96       IEnumerable<TypeMapping> typeCache) {
     95    public Deserializer(ReverseTypeCache typeCache) {
     96      this.typeCache = typeCache;
    9797      id2obj = new Dictionary<int, object>();
    9898      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       }
    13399    }
    134100
     
    157123        } else if (t == typeof(TypeToken)) {
    158124          Type((TypeToken)token);
     125        } else if (t == typeof(SerializerToken)) {
     126          Serializer((SerializerToken)token);
    159127        } else {
    160128          throw new PersistenceException("invalid token type");
     
    173141
    174142    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));
    176148    }
    177149
    178150    private void CompositeStartHandler(BeginToken token) {
    179151      InstantiateParent();
    180       Type type = typeIds[(int)token.TypeId];
     152      Type type = typeCache.GetType(token.TypeId);
    181153      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));
    183155      } catch (Exception e) {
    184156        if (e is InvalidCastException || e is KeyNotFoundException) {
     
    195167
    196168    private void CompositeEndHandler(EndToken token) {
    197       Type type = typeIds[(int)token.TypeId];
    198169      Midwife midwife = parentStack.Pop();
    199170      if (midwife.Obj == null)
    200171        CreateInstance(midwife);
    201172      midwife.Populate();
    202       SetValue(token.Name, midwife.Obj);
     173      SetValue(midwife.Name, midwife.Obj);
    203174    }
    204175
    205176    private void PrimitiveHandler(PrimitiveToken token) {
    206       Type type = typeIds[(int)token.TypeId];
    207177      try {
    208         object value = ((IPrimitiveSerializer)serializerMapping[type]).Parse(token.SerialData);
     178        object value = typeCache.GetPrimitiveSerializer(token.TypeId).Parse(token.SerialData);
    209179        if (token.Id != null)
    210180          id2obj[(int)token.Id] = value;
     
    214184          throw new PersistenceException(String.Format(
    215185            "Invalid primitive serializer configuration for type \"{0}\".",
    216             type.AssemblyQualifiedName), e);
     186            typeCache.GetType(token.TypeId).AssemblyQualifiedName), e);
    217187        } else {
    218188          throw new PersistenceException(String.Format(
    219189            "Unexpected exception while trying to parse object of type \"{0}\".",
    220             type.AssemblyQualifiedName), e);
     190            typeCache.GetType(token.TypeId).AssemblyQualifiedName), e);
    221191        }
    222192      }
Note: See TracChangeset for help on using the changeset viewer.