Index: trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 2676)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data {
+  [EmptyStorableClass]
+  [Item("BoolArrayData", "Represents an array of boolean values.")]
+  [Creatable("Test")]
+  public sealed class BoolArrayData : ValueTypeArrayData<bool>, IStringConvertibleArrayData {
+    public BoolArrayData() : base() { }
+    public BoolArrayData(int length) : base(length) { }
+    public BoolArrayData(bool[] elements) : base(elements) { }
+    protected BoolArrayData(BoolArrayData elements) : base(elements) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      BoolArrayData clone = new BoolArrayData(this);
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
+    }
+
+    #region IStringConvertibleArrayData Members
+    int IStringConvertibleArrayData.Length {
+      get { return Length; }
+      set { Length = value; }
+    }
+    bool IStringConvertibleArrayData.Validate(string value) {
+      bool b;
+      return bool.TryParse(value, out b);
+    }
+    string IStringConvertibleArrayData.GetValue(int index) {
+      return this[index].ToString();
+    }
+    bool IStringConvertibleArrayData.SetValue(string value, int index) {
+      bool b;
+      if (bool.TryParse(value, out b)) {
+        this[index] = b;
+        return true;
+      } else {
+        return false;
+      }
+    }
+    event EventHandler<EventArgs<int>> IStringConvertibleArrayData.ItemChanged {
+      add { base.ItemChanged += value; }
+      remove { base.ItemChanged -= value; }
+    }
+    event EventHandler IStringConvertibleArrayData.Reset {
+      add { base.Reset += value; }
+      remove { base.Reset -= value; }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Data/3.3/BoolData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolData.cs	(revision 2676)
@@ -41,4 +41,9 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      bool b;
+      return bool.TryParse(value, out b);
+    }
     string IStringConvertibleData.GetValue() {
       return Value.ToString();
@@ -53,4 +58,5 @@
       }
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/DateTimeData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DateTimeData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/DateTimeData.cs	(revision 2676)
@@ -45,4 +45,9 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      DateTime d;
+      return DateTime.TryParse(value, out d);
+    }
     string IStringConvertibleData.GetValue() {
       return Value.ToString("o");  // round-trip format
@@ -57,4 +62,5 @@
       }
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs	(revision 2676)
@@ -45,4 +45,9 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      double d;
+      return double.TryParse(value, out d);
+    }
     string IStringConvertibleData.GetValue() {
       return Value.ToString("r");  // round-trip format
@@ -57,4 +62,5 @@
       }
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 2676)
@@ -103,4 +103,5 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="BoolArrayData.cs" />
     <Compile Include="IStringConvertibleArrayData.cs" />
     <Compile Include="ValueTypeArrayData.cs" />
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArrayData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArrayData.cs	(revision 2676)
@@ -31,9 +31,10 @@
     int Length { get; set; }
 
+    bool Validate(string value);
     string GetValue(int index);
     bool SetValue(string value, int index);
 
-    event ChangedEventHandler Changed;
     event EventHandler<EventArgs<int>> ItemChanged;
+    event EventHandler Reset;
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleData.cs	(revision 2676)
@@ -28,4 +28,5 @@
 namespace HeuristicLab.Data {
   public interface IStringConvertibleData {
+    bool Validate(string value);
     string GetValue();
     bool SetValue(string value);
Index: trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 2676)
@@ -24,4 +24,5 @@
 using System.Text;
 using System.Xml;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -34,6 +35,6 @@
     public IntArrayData() : base() { }
     public IntArrayData(int length) : base(length) { }
-    public IntArrayData(IntArrayData elements) : base(elements) { }
     public IntArrayData(int[] elements) : base(elements) { }
+    protected IntArrayData(IntArrayData elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -43,7 +44,12 @@
     }
 
+    #region IStringConvertibleArrayData Members
     int IStringConvertibleArrayData.Length {
       get { return Length; }
       set { Length = value; }
+    }
+    bool IStringConvertibleArrayData.Validate(string value) {
+      int i;
+      return int.TryParse(value, out i);
     }
     string IStringConvertibleArrayData.GetValue(int index) {
@@ -59,4 +65,13 @@
       }
     }
+    event EventHandler<EventArgs<int>> IStringConvertibleArrayData.ItemChanged {
+      add { base.ItemChanged += value; }
+      remove { base.ItemChanged -= value; }
+    }
+    event EventHandler IStringConvertibleArrayData.Reset {
+      add { base.Reset += value; }
+      remove { base.Reset -= value; }
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/IntData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/IntData.cs	(revision 2676)
@@ -41,4 +41,9 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      int i;
+      return int.TryParse(value, out i);
+    }
     string IStringConvertibleData.GetValue() {
       return Value.ToString();
@@ -53,4 +58,5 @@
       }
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/StringData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/StringData.cs	(revision 2676)
@@ -63,4 +63,8 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      return true;
+    }
     string IStringConvertibleData.GetValue() {
       return Value;
@@ -70,4 +74,5 @@
       return true;
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/TimeSpanData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/TimeSpanData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/TimeSpanData.cs	(revision 2676)
@@ -41,4 +41,9 @@
     }
 
+    #region IStringConvertibleData Members
+    bool IStringConvertibleData.Validate(string value) {
+      TimeSpan t;
+      return TimeSpan.TryParse(value, out t);
+    }
     string IStringConvertibleData.GetValue() {
       return Value.ToString();
@@ -53,4 +58,5 @@
       }
     }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs	(revision 2669)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs	(revision 2676)
@@ -41,5 +41,5 @@
         Array.Copy(array, newArray, Math.Min(value, array.Length));
         array = newArray;
-        OnChanged();
+        OnReset();
       }
     }
@@ -60,11 +60,11 @@
       array = new T[length];
     }
-    public ValueTypeArrayData(ValueTypeArrayData<T> elements) {
-      if (elements == null) throw new ArgumentNullException();
-      array = (T[])elements.array.Clone();
-    }
     public ValueTypeArrayData(T[] elements) {
       if (elements == null) throw new ArgumentNullException();
       array = (T[])elements.Clone();
+    }
+    protected ValueTypeArrayData(ValueTypeArrayData<T> elements) {
+      if (elements == null) throw new ArgumentNullException();
+      array = (T[])elements.array.Clone();
     }
 
@@ -91,10 +91,16 @@
     }
 
-    public event EventHandler<EventArgs<int>> ItemChanged;
-    protected virtual void OnItemChanged(int index) {
+    protected event EventHandler<EventArgs<int>> ItemChanged;
+    private void OnItemChanged(int index) {
       if (ItemChanged != null)
         ItemChanged(this, new EventArgs<int>(index));
       OnChanged();
     }
+    protected event EventHandler Reset;
+    private void OnReset() {
+      if (Reset != null)
+        Reset(this, EventArgs.Empty);
+      OnChanged();
+    }
   }
 }
