Index: /trunk/sources/HeuristicLab.Persistence/3.3/Core/Serializer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Persistence/3.3/Core/Serializer.cs	(revision 3576)
+++ /trunk/sources/HeuristicLab.Persistence/3.3/Core/Serializer.cs	(revision 3577)
@@ -223,11 +223,13 @@
             compositeSerializer.CreateMetaInfo(value),
             emitTypeInfo);
-        throw CreatePersistenceException(type);
+        throw CreatePersistenceException(type, "Could not determine how to serialize a value.");      
       } catch (Exception x) {
         if (isTestRun) {
           exceptions.Add(x);
           return new List<ISerializationToken>().GetEnumerator();
+        } else if (x is PersistenceException) {
+          throw;
         } else {
-          throw;
+          throw CreatePersistenceException(type, "Uncaught exception during serialization: " + x.Message);
         }
       } finally {
@@ -236,7 +238,8 @@
     }
 
-    private PersistenceException CreatePersistenceException(Type type) {
+    private PersistenceException CreatePersistenceException(Type type, string message) {
       StringBuilder sb = new StringBuilder();
-      sb.Append("Could not determine how to serialize a value of type \"")
+      sb.Append(message)
+        .Append("Type was \"")
         .Append(type.VersionInvariantName())
         .AppendLine("\"")
@@ -248,5 +251,5 @@
           .Append(" ---- (")
           .Append(ps.GetType().VersionInvariantName())
-          .AppendLine(")");          
+          .AppendLine(")");
       sb.AppendLine("Rejected by all composite serializers:");
       foreach (var cs in configuration.CompositeSerializers)
Index: /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 3576)
+++ /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 3577)
@@ -144,12 +144,21 @@
 
     private static StorableClassAttribute GetStorableClassAttribute(Type type) {
-      return (StorableClassAttribute)type
-        .GetCustomAttributes(typeof(StorableClassAttribute), false)
-        .SingleOrDefault();
+      lock (storableClassCache) {
+        if (storableClassCache.ContainsKey(type))
+          return storableClassCache[type];
+        StorableClassAttribute attribute = type
+          .GetCustomAttributes(typeof(StorableClassAttribute), false)
+          .SingleOrDefault() as StorableClassAttribute;
+        storableClassCache.Add(type, attribute);
+        return attribute;
+      }
     }
 
-    private static bool HasStorableClassAttribute(Type type) {
-      return type.GetCustomAttributes(typeof(StorableClassAttribute), false).Length > 0;
+    public static bool HasStorableClassAttribute(Type type) {
+      return GetStorableClassAttribute(type) != null;
     }
+
+    private static Dictionary<Type, StorableClassAttribute> storableClassCache = 
+      new Dictionary<Type, StorableClassAttribute>();
 
     #endregion
Index: /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 3576)
+++ /trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 3577)
@@ -39,7 +39,16 @@
     /// </returns>
     public bool CanSerialize(Type type) {
+      bool markedStorable = StorableReflection.HasStorableClassAttribute(type);
       if (GetConstructor(type) == null)
-        return false;
-      return StorableReflection.IsEmptyOrStorableType(type, true);
+        if (markedStorable)
+          throw new Exception("[Storable] type has no default constructor and no [StorableConstructor]");
+        else
+          return false;
+      if (!StorableReflection.IsEmptyOrStorableType(type, true))
+        if (markedStorable)
+          throw new Exception("[Storable] type has non emtpy, non [Storable] base classes");
+        else
+          return false;
+      return true;
     }
 
@@ -53,9 +62,10 @@
     /// </returns>
     public string JustifyRejection(Type type) {
+      StringBuilder sb = new StringBuilder();
       if (GetConstructor(type) == null)
-        return "no default constructor and no storable constructor";
+        sb.Append("class has no default constructor and no [StorableConstructor]");
       if (!StorableReflection.IsEmptyOrStorableType(type, true))
-        return "class is not marked with the storable class attribute";
-      return "no reason";
+        sb.Append("class (or one of its bases) is not empty and not marked [Storable]; ");      
+      return sb.ToString();
     }
 
@@ -154,5 +164,5 @@
 
     private Dictionary<HookDesignator, List<StorableReflection.Hook>> hookCache =
-      new Dictionary<HookDesignator, List<StorableReflection.Hook>>();
+      new Dictionary<HookDesignator, List<StorableReflection.Hook>>();    
 
     #endregion
