Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/3.3/Core/Configuration.cs @ 3004

Last change on this file since 3004 was 3004, checked in by epitzer, 15 years ago

add complete persistence API docs (#548)

File size: 2.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using HeuristicLab.Persistence.Interfaces;
4using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
5
6namespace HeuristicLab.Persistence.Core {
7
8  /// <summary>
9  /// Defines the set of primitive and composite serializers that are to be used
10  /// for a certain seraial format. The configuration can be obtained from the
11  /// <code>ConfigurationService</code>.
12  /// </summary>
13  [StorableClass(StorableClassType.MarkedOnly)]   
14  public class Configuration {
15
16    [Storable]
17    private readonly Dictionary<Type, IPrimitiveSerializer> primitiveSerializers;
18
19    [Storable]
20    private readonly List<ICompositeSerializer> compositeSerializers;
21    private readonly Dictionary<Type, ICompositeSerializer> compositeSerializerCache;
22
23    [Storable]
24    public IFormat Format { get; private set; }
25   
26    private Configuration() {
27      compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
28    }
29
30    public Configuration(IFormat format,
31        IEnumerable<IPrimitiveSerializer> primitiveSerializers,
32        IEnumerable<ICompositeSerializer> compositeSerializers) {
33      this.Format = format;
34      this.primitiveSerializers = new Dictionary<Type, IPrimitiveSerializer>();
35      foreach (IPrimitiveSerializer primitiveSerializer in primitiveSerializers) {
36        if (primitiveSerializer.SerialDataType != format.SerialDataType) {
37          throw new ArgumentException("All primitive serializers must have the same IFormat.");
38        }
39        this.primitiveSerializers.Add(primitiveSerializer.SourceType, primitiveSerializer);
40      }
41      this.compositeSerializers = new List<ICompositeSerializer>(compositeSerializers);
42      compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
43    }
44
45    public IEnumerable<IPrimitiveSerializer> PrimitiveSerializers {
46      get { return primitiveSerializers.Values; }
47    }
48
49    public IEnumerable<ICompositeSerializer> CompositeSerializers {
50      get { return compositeSerializers; }
51    }
52
53    public IPrimitiveSerializer GetPrimitiveSerializer(Type type) {
54      IPrimitiveSerializer primitiveSerializer;
55      primitiveSerializers.TryGetValue(type, out primitiveSerializer);
56      return primitiveSerializer;
57    }
58
59    public ICompositeSerializer GetCompositeSerializer(Type type) {
60      if (compositeSerializerCache.ContainsKey(type))
61        return compositeSerializerCache[type];
62      foreach (ICompositeSerializer d in compositeSerializers) {
63        if (d.CanSerialize(type)) {
64          compositeSerializerCache.Add(type, d);
65          return d;
66        }
67      }
68      compositeSerializerCache.Add(type, null);
69      return null;
70    }
71  }
72
73}
Note: See TracBrowser for help on using the repository browser.