Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/13/11 13:01:28 (14 years ago)
Author:
epitzer
Message:

Added custom serializers for generic HashSets and Dictionaries that include the Comparer property (#1375)

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/ConcreteDictionarySerializer.cs

    r5289 r5290  
    2323using System.Collections;
    2424using System.Collections.Generic;
    25 using HeuristicLab.Persistence.Auxiliary;
     25using System.Linq;
    2626using HeuristicLab.Persistence.Core;
    2727using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3131
    3232  [StorableClass]
    33   internal sealed class DictionarySerializer : ICompositeSerializer {
     33  internal sealed class ConcreteDictionarySerializer : ICompositeSerializer {
    3434
    3535    [StorableConstructor]
    36     private DictionarySerializer(bool deserializing) { }
    37     public DictionarySerializer() { }
     36    private ConcreteDictionarySerializer(bool deserializing) { }
     37    public ConcreteDictionarySerializer() { }
    3838
    3939    public int Priority {
     
    4343
    4444    public bool CanSerialize(Type type) {
    45       return ReflectionTools.HasDefaultConstructor(type) &&
    46         type.GetInterface(typeof(IDictionary).FullName) != null;
     45      return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>);
    4746    }
    4847
    4948    public string JustifyRejection(Type type) {
    50       if (!ReflectionTools.HasDefaultConstructor(type))
    51         return "no default constructor";
    52       return "interface IDictionary not implemented";
     49      return "Type is not a generic Dictionary<>";
    5350    }
    5451
    5552    public IEnumerable<Tag> CreateMetaInfo(object o) {
    56       return new Tag[] { };
     53      yield return new Tag("Comparer", o.GetType().GetProperty("Comparer").GetValue(o, null));
    5754    }
    5855
     
    6663
    6764    public object CreateInstance(Type t, IEnumerable<Tag> metaInfo) {
    68       return Activator.CreateInstance(t, true);
     65      return Activator.CreateInstance(t, metaInfo.First().Value);
    6966    }
    7067
     
    7976          dict.Add(key.Value, value.Value);
    8077        }
    81       }
    82       catch (InvalidOperationException e) {
     78      } catch (InvalidOperationException e) {
    8379        throw new PersistenceException("Dictionaries must contain an even number of elements (key+value).", e);
    84       }
    85       catch (NotSupportedException e) {
     80      } catch (NotSupportedException e) {
    8681        throw new PersistenceException("The serialized dictionary type was read-only or had a fixed size and cannot be deserialized.", e);
    87       }
    88       catch (ArgumentNullException e) {
     82      } catch (ArgumentNullException e) {
    8983        throw new PersistenceException("Dictionary key was null.", e);
    90       }
    91       catch (ArgumentException e) {
     84      } catch (ArgumentException e) {
    9285        throw new PersistenceException("Duplicate dictionary key.", e);
    9386      }
Note: See TracChangeset for help on using the changeset viewer.