Changeset 5290 for trunk/sources/HeuristicLab.Persistence/3.3/Default
- Timestamp:
- 01/13/11 13:01:28 (14 years ago)
- Location:
- trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers
- Files:
-
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/ConcreteDictionarySerializer.cs
r5289 r5290 23 23 using System.Collections; 24 24 using System.Collections.Generic; 25 using HeuristicLab.Persistence.Auxiliary;25 using System.Linq; 26 26 using HeuristicLab.Persistence.Core; 27 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 31 31 32 32 [StorableClass] 33 internal sealed class DictionarySerializer : ICompositeSerializer {33 internal sealed class ConcreteDictionarySerializer : ICompositeSerializer { 34 34 35 35 [StorableConstructor] 36 private DictionarySerializer(bool deserializing) { }37 public DictionarySerializer() { }36 private ConcreteDictionarySerializer(bool deserializing) { } 37 public ConcreteDictionarySerializer() { } 38 38 39 39 public int Priority { … … 43 43 44 44 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<,>); 47 46 } 48 47 49 48 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<>"; 53 50 } 54 51 55 52 public IEnumerable<Tag> CreateMetaInfo(object o) { 56 return new Tag[] { };53 yield return new Tag("Comparer", o.GetType().GetProperty("Comparer").GetValue(o, null)); 57 54 } 58 55 … … 66 63 67 64 public object CreateInstance(Type t, IEnumerable<Tag> metaInfo) { 68 return Activator.CreateInstance(t, true);65 return Activator.CreateInstance(t, metaInfo.First().Value); 69 66 } 70 67 … … 79 76 dict.Add(key.Value, value.Value); 80 77 } 81 } 82 catch (InvalidOperationException e) { 78 } catch (InvalidOperationException e) { 83 79 throw new PersistenceException("Dictionaries must contain an even number of elements (key+value).", e); 84 } 85 catch (NotSupportedException e) { 80 } catch (NotSupportedException e) { 86 81 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) { 89 83 throw new PersistenceException("Dictionary key was null.", e); 90 } 91 catch (ArgumentException e) { 84 } catch (ArgumentException e) { 92 85 throw new PersistenceException("Duplicate dictionary key.", e); 93 86 } -
trunk/sources/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/HashSetSerializer.cs
r5289 r5290 23 23 using System.Collections; 24 24 using System.Collections.Generic; 25 using System.Linq; 25 26 using System.Reflection; 26 using HeuristicLab.Persistence.Auxiliary;27 27 using HeuristicLab.Persistence.Core; 28 28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; … … 32 32 33 33 [StorableClass] 34 internal sealed class EnumerableSerializer : ICompositeSerializer {34 internal sealed class HashSetSerializer : ICompositeSerializer { 35 35 36 36 [StorableConstructor] 37 private EnumerableSerializer(bool deserializing) { }38 public EnumerableSerializer() { }37 private HashSetSerializer(bool deserializing) { } 38 public HashSetSerializer() { } 39 39 40 40 public int Priority { 41 get { return 100; }41 get { return 250; } 42 42 } 43 43 44 45 44 public bool CanSerialize(Type type) { 46 return 47 ReflectionTools.HasDefaultConstructor(type) && 48 type.GetInterface(typeof(IEnumerable).FullName) != null && 49 type.GetMethod("Add") != null && 50 type.GetMethod("Add").GetParameters().Length == 1; 45 return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(HashSet<>); 51 46 } 52 47 53 48 public string JustifyRejection(Type type) { 54 if (!ReflectionTools.HasDefaultConstructor(type)) 55 return "no default constructor"; 56 if (type.GetInterface(typeof(IEnumerable).FullName) == null) 57 return "interface IEnumerable not implemented"; 58 if (type.GetMethod("Add") == null) 59 return "no 'Add()' method"; 60 return "no 'Add()' method with one argument"; 49 return "Type is not a generic HashSet<>"; 61 50 } 62 51 63 52 public IEnumerable<Tag> CreateMetaInfo(object o) { 64 return new Tag[] { };53 yield return new Tag("Comparer", o.GetType().GetProperty("Comparer").GetValue(o, null)); 65 54 } 66 55 … … 72 61 73 62 public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) { 74 return Activator.CreateInstance(type, true);63 return Activator.CreateInstance(type, metaInfo.First().Value); 75 64 } 76 65 … … 80 69 foreach (var tag in tags) 81 70 addMethod.Invoke(instance, new[] { tag.Value }); 82 } 83 catch (Exception e) { 71 } catch (Exception e) { 84 72 throw new PersistenceException("Exception caught while trying to populate enumerable.", e); 85 73 } 86 74 } 75 76 public object HashSet { get; set; } 87 77 } 88 78 }
Note: See TracChangeset
for help on using the changeset viewer.