Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/15/10 12:02:56 (14 years ago)
Author:
epitzer
Message:

prevent excessive caching of reflection information by re-instantiating serializers for every run (#548)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Core/Configuration.cs

    r3017 r3030  
    11using System;
     2using System.Linq;
    23using System.Collections.Generic;
    34using HeuristicLab.Persistence.Interfaces;
     
    1112  /// <c>ConfigurationService</c>.
    1213  /// </summary>
    13   [StorableClass]   
     14  [StorableClass]
    1415  public class Configuration {
    1516
     
    2728    [Storable]
    2829    public IFormat Format { get; private set; }
    29    
    30     private Configuration() {
     30
     31    [StorableConstructor]
     32    private Configuration(bool isDeserializing) {
    3133      compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
     34      if (isDeserializing)
     35        return;
     36      primitiveSerializers = new Dictionary<Type, IPrimitiveSerializer>();
     37      compositeSerializers = new List<ICompositeSerializer>();
    3238    }
    3339
     
    4046    public Configuration(IFormat format,
    4147        IEnumerable<IPrimitiveSerializer> primitiveSerializers,
    42         IEnumerable<ICompositeSerializer> compositeSerializers) {
     48        IEnumerable<ICompositeSerializer> compositeSerializers)
     49      : this(false) {
    4350      this.Format = format;
    44       this.primitiveSerializers = new Dictionary<Type, IPrimitiveSerializer>();
    45       foreach (IPrimitiveSerializer primitiveSerializer in primitiveSerializers) {
    46         if (primitiveSerializer.SerialDataType != format.SerialDataType) {
    47           throw new ArgumentException("All primitive serializers must have the same IFormat.");
    48         }
     51      this.compositeSerializers.AddRange(compositeSerializers);
     52      foreach (var primitiveSerializer in primitiveSerializers) {
     53        if (primitiveSerializer.SerialDataType != format.SerialDataType)
     54          throw new ArgumentException(string.Format(
     55            "primitive serializer's ({0}) serialized data type ({1}) " + Environment.NewLine +
     56            "is not compatible with selected format's ({2}) seriali data type ({3})",
     57            primitiveSerializers.GetType().FullName, primitiveSerializer.SerialDataType.FullName,
     58            format.Name, format.SerialDataType.FullName));           
    4959        this.primitiveSerializers.Add(primitiveSerializer.SourceType, primitiveSerializer);
    50       }
    51       this.compositeSerializers = new List<ICompositeSerializer>(compositeSerializers);
    52       compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
     60      }     
    5361    }
    5462
     
    97105      return null;
    98106    }
     107
     108    /// <summary>
     109    /// Copies this configuration and re-instantiates all serializers.
     110    /// </summary>
     111    /// <returns>A new <see cref="Configuration"/></returns>
     112    public Configuration Copy() {
     113      var config = new Configuration(false);
     114      config.Format = Format;
     115      foreach (var ps in primitiveSerializers)
     116        config.primitiveSerializers.Add(
     117          ps.Key,
     118          (IPrimitiveSerializer)Activator.CreateInstance(ps.Value.GetType()));
     119      foreach (var cs in compositeSerializers)
     120        config.compositeSerializers.Add((ICompositeSerializer)Activator.CreateInstance(cs.GetType()));
     121      return config;
     122    }
     123
    99124  }
    100125
Note: See TracChangeset for help on using the changeset viewer.