Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/DataMemberAccessor.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/DataMemberAccessor.cs	(revision 1843)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/DataMemberAccessor.cs	(revision 1852)
@@ -6,6 +6,6 @@
 
   public class DataMemberAccessor {
-    
-    public readonly Func<object> Get;    
+
+    public readonly Func<object> Get;
     public readonly Action<object> Set;
     public readonly string Name;
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/EmptyStorableClassAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/EmptyStorableClassAttribute.cs	(revision 1843)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/EmptyStorableClassAttribute.cs	(revision 1852)
@@ -4,5 +4,4 @@
 
 namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
-
 
   [AttributeUsage(
@@ -14,4 +13,11 @@
     private static readonly Dictionary<Type, bool> emptyTypeInfo = new Dictionary<Type, bool>();
 
+    private const BindingFlags BINDING_FLAGS =
+      BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly;
+
+    /// <summary>
+    /// Check if supplied type is empty (i.e. no properties or fields) or is marked as empty storable.
+    /// This method is not recusrice and does not check if base types are also empty.
+    /// </summary>    
     public static bool IsEmptyStorable(Type type) {
       if (emptyTypeInfo.ContainsKey(type))
@@ -20,23 +26,27 @@
         return true;
       }
-      foreach (var attribute in type.GetCustomAttributes(false)) {
-        EmptyStorableClassAttribute empty = attribute as EmptyStorableClassAttribute;
-        if (empty != null) {
+      foreach (var attribute in type.GetCustomAttributes(false)) {        
+        if (attribute as EmptyStorableClassAttribute != null) {
           emptyTypeInfo.Add(type, true);
           return true;
         }
-      }
-      int nFields = 0;
-      foreach (MemberInfo memberInfo in type.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) {
-        if (memberInfo.MemberType == MemberTypes.Field ||
-          memberInfo.MemberType == MemberTypes.Property)
-          nFields += 1;
-      }
-      if (nFields == 0) {
-        emptyTypeInfo.Add(type, true);
-        return true;
-      }
-      emptyTypeInfo.Add(type, false);
-      return false;
+      }      
+      foreach (MemberInfo memberInfo in type.GetMembers(BINDING_FLAGS)) {
+        if ( 
+          memberInfo.MemberType == MemberTypes.Field && IsModifiableField((FieldInfo)memberInfo) ||          
+          memberInfo.MemberType == MemberTypes.Property && IsModifiableProperty((PropertyInfo)memberInfo) ) {
+          emptyTypeInfo.Add(type, false);
+          return false;
+        }          
+      }      
+      emptyTypeInfo.Add(type, true);
+      return true;            
+    }
+
+    public static bool IsModifiableField(FieldInfo fi) {      
+      return !fi.IsLiteral && !fi.IsInitOnly;
+    }
+    public static bool IsModifiableProperty(PropertyInfo pi) {
+      return pi.CanWrite;
     }
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs	(revision 1843)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs	(revision 1852)
@@ -26,5 +26,5 @@
     public static IEnumerable<KeyValuePair<StorableAttribute, MemberInfo>>
         GetStorableMembers(Type type, bool inherited) {
-      if (type.BaseType != null)
+      if (inherited && type.BaseType != null)
         foreach (var pair in GetStorableMembers(type.BaseType))
           yield return pair;
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 1843)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 1852)
@@ -17,8 +17,13 @@
 
     public bool CanSerialize(Type type) {
-      return ReflectionTools.HasDefaultConstructor(type) &&
-        (StorableAttribute.GetStorableMembers(type, false).Count() > 0 ||
-          EmptyStorableClassAttribute.IsEmptyStorable(type));
-
+      if (!ReflectionTools.HasDefaultConstructor(type))
+        return false;
+      while (type != null) {        
+        if (StorableAttribute.GetStorableMembers(type, false).Count() == 0 &&
+            !EmptyStorableClassAttribute.IsEmptyStorable(type))
+          return false;
+        type = type.BaseType;
+      }
+      return true;
     }
 
