Free cookie consent management tool by TermsFeed Policy Generator

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

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

Make StorableClass attribute compulsory for StorableSerializer to work, add named property StorableClassType to choose between Empty and MarkedOnly, later other options will be added. (#548)

File size: 2.5 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  [StorableClass(StorableClassType.MarkedOnly)]   
9  public class Configuration {
10
11    [Storable]
12    private readonly Dictionary<Type, IPrimitiveSerializer> primitiveSerializers;
13
14    [Storable]
15    private readonly List<ICompositeSerializer> compositeSerializers;
16    private readonly Dictionary<Type, ICompositeSerializer> compositeSerializerCache;
17
18    [Storable]
19    public IFormat Format { get; private set; }
20   
21    private Configuration() {
22      compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
23    }
24
25    public Configuration(IFormat format,
26        IEnumerable<IPrimitiveSerializer> primitiveSerializers,
27        IEnumerable<ICompositeSerializer> compositeSerializers) {
28      this.Format = format;
29      this.primitiveSerializers = new Dictionary<Type, IPrimitiveSerializer>();
30      foreach (IPrimitiveSerializer primitiveSerializer in primitiveSerializers) {
31        if (primitiveSerializer.SerialDataType != format.SerialDataType) {
32          throw new ArgumentException("All primitive serializers must have the same IFormat.");
33        }
34        this.primitiveSerializers.Add(primitiveSerializer.SourceType, primitiveSerializer);
35      }
36      this.compositeSerializers = new List<ICompositeSerializer>(compositeSerializers);
37      compositeSerializerCache = new Dictionary<Type, ICompositeSerializer>();
38    }
39
40    public IEnumerable<IPrimitiveSerializer> PrimitiveSerializers {
41      get { return primitiveSerializers.Values; }
42    }
43
44    public IEnumerable<ICompositeSerializer> CompositeSerializers {
45      get { return compositeSerializers; }
46    }
47
48    public IPrimitiveSerializer GetPrimitiveSerializer(Type type) {
49      IPrimitiveSerializer primitiveSerializer;
50      primitiveSerializers.TryGetValue(type, out primitiveSerializer);
51      return primitiveSerializer;
52    }
53
54    public ICompositeSerializer GetCompositeSerializer(Type type) {
55      if (compositeSerializerCache.ContainsKey(type))
56        return compositeSerializerCache[type];
57      foreach (ICompositeSerializer d in compositeSerializers) {
58        if (d.CanSerialize(type)) {
59          compositeSerializerCache.Add(type, d);
60          return d;
61        }
62      }
63      compositeSerializerCache.Add(type, null);
64      return null;
65    }
66  }
67
68}
Note: See TracBrowser for help on using the repository browser.