Changeset 3577


Ignore:
Timestamp:
05/01/10 12:37:16 (12 years ago)
Author:
epitzer
Message:

throw Exception if class is marked [Storable] but cannot be serialized with the StorableSerializer (#548)

Location:
trunk/sources/HeuristicLab.Persistence/3.3
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Core/Serializer.cs

    r3016 r3577  
    223223            compositeSerializer.CreateMetaInfo(value),
    224224            emitTypeInfo);
    225         throw CreatePersistenceException(type);
     225        throw CreatePersistenceException(type, "Could not determine how to serialize a value.");     
    226226      } catch (Exception x) {
    227227        if (isTestRun) {
    228228          exceptions.Add(x);
    229229          return new List<ISerializationToken>().GetEnumerator();
     230        } else if (x is PersistenceException) {
     231          throw;
    230232        } else {
    231           throw;
     233          throw CreatePersistenceException(type, "Uncaught exception during serialization: " + x.Message);
    232234        }
    233235      } finally {
     
    236238    }
    237239
    238     private PersistenceException CreatePersistenceException(Type type) {
     240    private PersistenceException CreatePersistenceException(Type type, string message) {
    239241      StringBuilder sb = new StringBuilder();
    240       sb.Append("Could not determine how to serialize a value of type \"")
     242      sb.Append(message)
     243        .Append("Type was \"")
    241244        .Append(type.VersionInvariantName())
    242245        .AppendLine("\"")
     
    248251          .Append(" ---- (")
    249252          .Append(ps.GetType().VersionInvariantName())
    250           .AppendLine(")");         
     253          .AppendLine(")");
    251254      sb.AppendLine("Rejected by all composite serializers:");
    252255      foreach (var cs in configuration.CompositeSerializers)
  • trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs

    r3554 r3577  
    144144
    145145    private static StorableClassAttribute GetStorableClassAttribute(Type type) {
    146       return (StorableClassAttribute)type
    147         .GetCustomAttributes(typeof(StorableClassAttribute), false)
    148         .SingleOrDefault();
     146      lock (storableClassCache) {
     147        if (storableClassCache.ContainsKey(type))
     148          return storableClassCache[type];
     149        StorableClassAttribute attribute = type
     150          .GetCustomAttributes(typeof(StorableClassAttribute), false)
     151          .SingleOrDefault() as StorableClassAttribute;
     152        storableClassCache.Add(type, attribute);
     153        return attribute;
     154      }
    149155    }
    150156
    151     private static bool HasStorableClassAttribute(Type type) {
    152       return type.GetCustomAttributes(typeof(StorableClassAttribute), false).Length > 0;
     157    public static bool HasStorableClassAttribute(Type type) {
     158      return GetStorableClassAttribute(type) != null;
    153159    }
     160
     161    private static Dictionary<Type, StorableClassAttribute> storableClassCache =
     162      new Dictionary<Type, StorableClassAttribute>();
    154163
    155164    #endregion
  • trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs

    r3553 r3577  
    3939    /// </returns>
    4040    public bool CanSerialize(Type type) {
     41      bool markedStorable = StorableReflection.HasStorableClassAttribute(type);
    4142      if (GetConstructor(type) == null)
    42         return false;
    43       return StorableReflection.IsEmptyOrStorableType(type, true);
     43        if (markedStorable)
     44          throw new Exception("[Storable] type has no default constructor and no [StorableConstructor]");
     45        else
     46          return false;
     47      if (!StorableReflection.IsEmptyOrStorableType(type, true))
     48        if (markedStorable)
     49          throw new Exception("[Storable] type has non emtpy, non [Storable] base classes");
     50        else
     51          return false;
     52      return true;
    4453    }
    4554
     
    5362    /// </returns>
    5463    public string JustifyRejection(Type type) {
     64      StringBuilder sb = new StringBuilder();
    5565      if (GetConstructor(type) == null)
    56         return "no default constructor and no storable constructor";
     66        sb.Append("class has no default constructor and no [StorableConstructor]");
    5767      if (!StorableReflection.IsEmptyOrStorableType(type, true))
    58         return "class is not marked with the storable class attribute";
    59       return "no reason";
     68        sb.Append("class (or one of its bases) is not empty and not marked [Storable]; ");     
     69      return sb.ToString();
    6070    }
    6171
     
    154164
    155165    private Dictionary<HookDesignator, List<StorableReflection.Hook>> hookCache =
    156       new Dictionary<HookDesignator, List<StorableReflection.Hook>>();
     166      new Dictionary<HookDesignator, List<StorableReflection.Hook>>();   
    157167
    158168    #endregion
Note: See TracChangeset for help on using the changeset viewer.