Changeset 11058


Ignore:
Timestamp:
06/30/14 14:42:38 (5 years ago)
Author:
abeham
Message:

#2203: Made VariableStore IDeepCloneable and implemented cloning there

Location:
trunk/sources/HeuristicLab.Scripting/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Scripting/3.3/CSharpScript.cs

    r11056 r11058  
    2121
    2222using System;
    23 using System.IO;
    2423using System.Linq;
    2524using System.Reflection;
     
    2726using HeuristicLab.Common;
    2827using HeuristicLab.Core;
    29 using HeuristicLab.Persistence.Core;
    3028using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    31 using HeuristicLab.Persistence.Default.Xml;
    3229
    3330namespace HeuristicLab.Scripting {
     
    8178    protected CSharpScript(CSharpScript original, Cloner cloner)
    8279      : base(original, cloner) {
    83       try {
    84         using (var serializerStream = new MemoryStream()) {
    85           XmlGenerator.Serialize(original.variableStore, serializerStream);
    86           var bytes = serializerStream.GetBuffer();
    87           using (var deserializerStream = new MemoryStream(bytes)) {
    88             variableStore = XmlParser.Deserialize<VariableStore>(deserializerStream);
    89           }
    90         }
    91       } catch (PersistenceException pe) {
    92         throw new NotSupportedException("Could not clone the script because some of its variables could not be cloned.", pe);
    93       }
     80      variableStore = cloner.Clone(original.variableStore);
    9481    }
    9582    public CSharpScript() {
  • trunk/sources/HeuristicLab.Scripting/3.3/VariableStore.cs

    r10506 r11058  
    2020#endregion
    2121
     22using System;
     23using System.IO;
    2224using HeuristicLab.Collections;
    2325using HeuristicLab.Common;
    2426using HeuristicLab.Core;
     27using HeuristicLab.Persistence.Core;
    2528using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     29using HeuristicLab.Persistence.Default.Xml;
    2630
    2731namespace HeuristicLab.Scripting {
    2832  [Item("VariableStore", "Represents a variable store.")]
    2933  [StorableClass]
    30   public class VariableStore : ObservableDictionary<string, object>, IContent {
     34  public class VariableStore : ObservableDictionary<string, object>, IContent, IDeepCloneable {
    3135    [StorableConstructor]
    3236    protected VariableStore(bool deserializing) : base(deserializing) { }
     37    protected VariableStore(VariableStore original, Cloner cloner) {
     38      cloner.RegisterClonedObject(original, this);
     39      foreach (var kvp in original.dict) {
     40        var clonedValue = kvp.Value as IDeepCloneable;
     41        if (clonedValue != null) {
     42          dict[kvp.Key] = cloner.Clone(clonedValue);
     43        } else {
     44          try {
     45            dict[kvp.Key] = CloneByPersistence(kvp.Value);
     46          } catch (PersistenceException pe) {
     47            throw new NotSupportedException("VariableStore: Variable " + kvp.Key + " could not be cloned.", pe);
     48          }
     49        }
     50      }
     51    }
    3352    public VariableStore() : base() { }
     53
     54    public object Clone() {
     55      return Clone(new Cloner());
     56    }
     57    public IDeepCloneable Clone(Cloner cloner) {
     58      return new VariableStore(this, cloner);
     59    }
     60
     61    protected object CloneByPersistence(object value) {
     62      using (var serializerStream = new MemoryStream()) {
     63        XmlGenerator.Serialize(value, serializerStream);
     64        var bytes = serializerStream.GetBuffer();
     65        using (var deserializerStream = new MemoryStream(bytes)) {
     66          return XmlParser.Deserialize<VariableStore>(deserializerStream);
     67        }
     68      }
     69    }
    3470  }
    3571}
Note: See TracChangeset for help on using the changeset viewer.