Index: branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAnalyzer.cs
===================================================================
--- branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAnalyzer.cs	(revision 6221)
+++ branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAnalyzer.cs	(revision 6222)
@@ -32,22 +32,14 @@
   /// Analyzes storables classes and creates a datastructure containing all required
   /// reflection information to serialize and deserialized these types.
-  /// </summary>
-  [StorableClass]
-  public sealed class StorableClassAnalyzer {
+  /// </summary>  
+  public static class StorableClassAnalyzer {
 
-    [Storable]
-    private static Dictionary<Type, TypeDescriptor> typeDescriptors;
+    private static Dictionary<Type, TypeDescriptor> typeDescriptors = new Dictionary<Type, TypeDescriptor>();
+    private static object typeDescriptorLock = new object();
 
     /// <summary>
     /// A list of all types that have been analyzed by this instance.
     /// </summary>
-    public IEnumerable<Type> KnownTypes { get { return typeDescriptors.Keys; } }
-
-    /// <summary>
-    /// Creates a new instance of the StorableClassAnalyzer.
-    /// </summary>
-    public StorableClassAnalyzer() {
-      typeDescriptors = new Dictionary<Type, TypeDescriptor>();
-    }
+    public static IEnumerable<Type> KnownTypes { get { lock (typeDescriptorLock) { return typeDescriptors.Keys; } } }
 
     /// <summary>
@@ -58,23 +50,25 @@
     /// <param name="type">The type to be analyzed.</param>
     /// <returns>A TypeDescriptor object that encapsulates all necessary reflection information.</returns>
-    public TypeDescriptor this[Type type] {
-      get {
-        TypeDescriptor typeDescriptor = null;
+    public static TypeDescriptor GetDescriptor(Type type) {
+      TypeDescriptor typeDescriptor = null;
+      lock (typeDescriptorLock) {
         typeDescriptors.TryGetValue(type, out typeDescriptor);
-        if (typeDescriptor != null)
-          return typeDescriptor;
-        typeDescriptor = new TypeDescriptor(type);
-        AddMembers(type, typeDescriptor);
-        if (!typeDescriptor.IsInvalid) {
-          typeDescriptor.Disentangle();
+      }
+      if (typeDescriptor != null)
+        return typeDescriptor;
+      typeDescriptor = new TypeDescriptor(type);
+      AddMembers(type, typeDescriptor);
+      if (!typeDescriptor.IsInvalid) {
+        typeDescriptor.Disentangle();
+        lock (typeDescriptorLock) {
           typeDescriptors[type] = typeDescriptor;
         }
-        return typeDescriptor;
       }
+      return typeDescriptor;
     }
 
-    private void AddMembers(Type type, TypeDescriptor typeDescriptor) {
+    private static void AddMembers(Type type, TypeDescriptor typeDescriptor) {
       if (type.BaseType != null) {
-        typeDescriptor.BaseTypeDescriptor = this[type.BaseType];
+        typeDescriptor.BaseTypeDescriptor = StorableClassAnalyzer.GetDescriptor(type.BaseType);
         if (typeDescriptor.BaseTypeDescriptor.IsInvalid) {
           typeDescriptor.IsInvalid = true;
Index: branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
===================================================================
--- branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 6221)
+++ branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 6222)
@@ -41,9 +41,5 @@
   public sealed class StorableSerializer : ICompositeSerializer {
 
-    private StorableClassAnalyzer analyzer;
-
-    public StorableSerializer() {
-      analyzer = new StorableClassAnalyzer();
-    }
+    public StorableSerializer() { }
 
     [StorableConstructor]
@@ -68,5 +64,5 @@
     /// </returns>
     public bool CanSerialize(Type type) {
-      TypeDescriptor desc = analyzer[type];
+      TypeDescriptor desc = StorableClassAnalyzer.GetDescriptor(type);
       if (desc.IsInvalid)
         return false;
@@ -91,5 +87,5 @@
     public string JustifyRejection(Type type) {
       StringBuilder sb = new StringBuilder();
-      TypeDescriptor desc = analyzer[type];
+      TypeDescriptor desc = StorableClassAnalyzer.GetDescriptor(type);
       if (desc.IsInvalid)
         sb.Append("class is not marked [StorableClass] but has mutable members.");
@@ -120,5 +116,5 @@
     /// <returns>An enumerable of <see cref="Tag"/>s.</returns>
     public IEnumerable<Tag> Decompose(object obj) {
-      foreach (var kvp in analyzer[obj.GetType()].Decompose(obj)) {
+      foreach (var kvp in StorableClassAnalyzer.GetDescriptor(obj.GetType()).Decompose(obj)) {
         yield return new Tag(kvp.Key, kvp.Value);
       }
@@ -133,5 +129,5 @@
     public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
       try {
-        return analyzer[type].CreateInstance();
+        return StorableClassAnalyzer.GetDescriptor(type).CreateInstance();
       } catch (TargetInvocationException x) {
         throw new PersistenceException(
@@ -148,5 +144,5 @@
     /// <param name="type">The type.</param>
     public void Populate(object instance, IEnumerable<Tag> objects, Type type) {
-      analyzer[type].Populate(instance, objects.ToDictionary(kvp => kvp.Name, kvp => kvp.Value));
+      StorableClassAnalyzer.GetDescriptor(type).Populate(instance, objects.ToDictionary(kvp => kvp.Name, kvp => kvp.Value));
     }
 
