Index: /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 13695)
@@ -80,5 +80,5 @@
       lengthTextBox.Enabled = Content != null;
       dataGridView.Enabled = Content != null;
-      lengthTextBox.ReadOnly = ReadOnly;
+      lengthTextBox.ReadOnly = ReadOnly || (Content != null && !Content.Resizable);
       dataGridView.ReadOnly = ReadOnly;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 13695)
@@ -28,5 +28,5 @@
   [Item("BoolArray", "Represents an array of boolean values.")]
   [StorableClass]
-  public class BoolArray : ValueTypeArray<bool>, IStringConvertibleArray {
+  public class BoolArray : StringConvertibleArray<bool> {
     [StorableConstructor]
     protected BoolArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       bool val;
       bool valid = bool.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString();
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       bool val;
       if (bool.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
-      return Validate(value, out errorMessage);
-    }
-    string IStringConvertibleArray.GetValue(int index) {
-      return GetValue(index);
-    }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
-      return SetValue(value, index);
-    }
-    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 13695)
@@ -28,5 +28,5 @@
   [Item("DoubleArray", "Represents an array of double values.")]
   [StorableClass]
-  public class DoubleArray : ValueTypeArray<double>, IStringConvertibleArray {
+  public class DoubleArray : StringConvertibleArray<double> {
     [StorableConstructor]
     protected DoubleArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       double val;
       bool valid = double.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString("r");
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       double val;
       if (double.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
-      return Validate(value, out errorMessage);
-    }
-    string IStringConvertibleArray.GetValue(int index) {
-      return GetValue(index);
-    }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
-      return SetValue(value, index);
-    }
-    #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 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 13695)
@@ -124,4 +124,5 @@
     <Compile Include="ComparisonType.cs" />
     <Compile Include="EnumValue.cs" />
+    <Compile Include="Interfaces\IValueTypeArray.cs" />
     <Compile Include="Path Types\DirectoryValue.cs" />
     <Compile Include="Path Types\FileValue.cs" />
@@ -148,4 +149,5 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="StringArray.cs" />
+    <Compile Include="StringConvertibleArray.cs" />
     <Compile Include="StringMatrix.cs" />
     <Compile Include="StringValue.cs" />
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 13695)
@@ -28,5 +28,5 @@
   [Item("IntArray", "Represents an array of integer values.")]
   [StorableClass]
-  public class IntArray : ValueTypeArray<int>, IStringConvertibleArray {
+  public class IntArray : StringConvertibleArray<int> {
     [StorableConstructor]
     protected IntArray(bool deserializing) : base(deserializing) { }
@@ -42,5 +42,5 @@
     }
 
-    protected virtual bool Validate(string value, out string errorMessage) {
+    protected override bool Validate(string value, out string errorMessage) {
       int val;
       bool valid = int.TryParse(value, out val);
@@ -55,8 +55,8 @@
       return valid;
     }
-    protected virtual string GetValue(int index) {
+    protected override string GetValue(int index) {
       return this[index].ToString();
     }
-    protected virtual bool SetValue(string value, int index) {
+    protected override bool SetValue(string value, int index) {
       int val;
       if (int.TryParse(value, out val)) {
@@ -67,20 +67,4 @@
       }
     }
-
-    #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
-    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
-      return Validate(value, out errorMessage);
-    }
-    string IStringConvertibleArray.GetValue(int index) {
-      return GetValue(index);
-    }
-    bool IStringConvertibleArray.SetValue(string value, int index) {
-      return SetValue(value, index);
-    }
-    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IStringConvertibleArray.cs	(revision 13695)
@@ -20,22 +20,11 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using HeuristicLab.Common;
 
 namespace HeuristicLab.Data {
-  public interface IStringConvertibleArray : IContent {
-    int Length { get; set; }
-    IEnumerable<string> ElementNames { get; set; }
-
-    bool ReadOnly { get; }
-
+  public interface IStringConvertibleArray : IContent, IValueTypeArray {
     bool Validate(string value, out string errorMessage);
     string GetValue(int index);
     bool SetValue(string value, int index);
-
-    event EventHandler ElementNamesChanged;
-    event EventHandler<EventArgs<int>> ItemChanged;
-    event EventHandler Reset;
   }
 }
Index: /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs	(revision 13695)
+++ /trunk/sources/HeuristicLab.Data/3.3/Interfaces/IValueTypeArray.cs	(revision 13695)
@@ -0,0 +1,51 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public interface IValueTypeArray : IItem, IEnumerable {
+    bool ReadOnly { get; }
+    IValueTypeArray AsReadOnly();
+
+    int Length { get; set; }
+    bool Resizable { get; set; }
+    event EventHandler ResizableChanged;
+
+    IEnumerable<string> ElementNames { get; set; }
+    event EventHandler ElementNamesChanged;
+
+    event EventHandler<EventArgs<int>> ItemChanged;
+    event EventHandler Reset;
+  }
+
+  public interface IValueTypeArray<T> : IValueTypeArray, IEnumerable<T> where T : struct {
+    T this[int index] { get; set; }
+  }
+}
+
+
Index: /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 13695)
@@ -61,5 +61,5 @@
     public virtual int Length {
       get { return array.Length; }
-      protected set {
+      set {
         if (ReadOnly) throw new NotSupportedException("Length cannot be set. StringArray is read-only.");
         if (value != Length) {
@@ -72,4 +72,16 @@
       }
     }
+    [Storable]
+    protected bool resizable = true;
+    public bool Resizable {
+      get { return resizable; }
+      set {
+        if (resizable != value) {
+          resizable = value;
+          OnResizableChanged();
+        }
+      }
+    }
+
     public virtual string this[int index] {
       get { return array[index]; }
@@ -102,4 +114,5 @@
       this.array = (string[])original.array.Clone();
       this.readOnly = original.readOnly;
+      this.resizable = original.resizable;
       this.elementNames = new List<string>(original.elementNames);
     }
@@ -107,4 +120,5 @@
       array = new string[0];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -114,4 +128,5 @@
         array[i] = string.Empty;
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -122,4 +137,5 @@
         array[i] = elements[i] == null ? string.Empty : elements[i];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -133,4 +149,7 @@
       readOnlyStringArray.readOnly = true;
       return readOnlyStringArray;
+    }
+    IValueTypeArray IValueTypeArray.AsReadOnly() {
+      return AsReadOnly();
     }
 
@@ -155,5 +174,4 @@
       return array.Cast<string>().GetEnumerator();
     }
-
     IEnumerator IEnumerable.GetEnumerator() {
       return GetEnumerator();
@@ -181,4 +199,10 @@
     }
 
+    public event EventHandler ResizableChanged;
+    protected virtual void OnResizableChanged() {
+      EventHandler handler = ResizableChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ElementNamesChanged;
     protected virtual void OnElementNamesChanged() {
@@ -187,5 +211,4 @@
         handler(this, EventArgs.Empty);
     }
-
     public event EventHandler<EventArgs<int>> ItemChanged;
     protected virtual void OnItemChanged(int index) {
@@ -203,8 +226,4 @@
 
     #region IStringConvertibleArray Members
-    int IStringConvertibleArray.Length {
-      get { return Length; }
-      set { Length = value; }
-    }
     bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/StringConvertibleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringConvertibleArray.cs	(revision 13695)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringConvertibleArray.cs	(revision 13695)
@@ -0,0 +1,57 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data {
+  [Item("StringConvertibleArray", "Represents an array of string convertible values.")]
+  [StorableClass]
+  public abstract class StringConvertibleArray<T> : ValueTypeArray<T>, IStringConvertibleArray where T : struct {
+    [StorableConstructor]
+    protected StringConvertibleArray(bool deserializing) : base(deserializing) { }
+    protected StringConvertibleArray(StringConvertibleArray<T> original, Cloner cloner)
+      : base(original, cloner) { }
+
+    protected StringConvertibleArray() : base() { }
+    protected StringConvertibleArray(int length) : base(length) { }
+    protected StringConvertibleArray(T[] elements) : base(elements) { }
+
+    protected abstract bool Validate(string value, out string errorMessage);
+    protected abstract string GetValue(int index);
+    protected abstract bool SetValue(string value, int index);
+
+    #region IStringConvertibleArray Members
+    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
+      return Validate(value, out errorMessage);
+    }
+    string IStringConvertibleArray.GetValue(int index) {
+      return GetValue(index);
+    }
+    bool IStringConvertibleArray.SetValue(string value, int index) {
+      return SetValue(value, index);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 13694)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 13695)
@@ -33,5 +33,5 @@
   [Item("ValueTypeArray", "An abstract base class for representing arrays of value types.")]
   [StorableClass]
-  public abstract class ValueTypeArray<T> : Item, IEnumerable<T> where T : struct {
+  public abstract class ValueTypeArray<T> : Item, IValueTypeArray<T> where T : struct {
     private const int maximumToStringLength = 100;
 
@@ -75,4 +75,18 @@
       #endregion
     }
+
+    [Storable]
+    protected bool resizable = true;
+    public bool Resizable {
+      get { return resizable; }
+      set {
+        if (resizable != value) {
+          resizable = value;
+          OnResizableChanged();
+        }
+      }
+    }
+
+
     public virtual T this[int index] {
       get { return array[index]; }
@@ -103,4 +117,5 @@
       this.array = (T[])original.array.Clone();
       this.readOnly = original.readOnly;
+      this.resizable = original.resizable;
       this.elementNames = new List<string>(original.elementNames);
     }
@@ -108,4 +123,5 @@
       array = new T[0];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -113,4 +129,5 @@
       array = new T[length];
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
@@ -119,8 +136,9 @@
       array = (T[])elements.Clone();
       readOnly = false;
+      resizable = true;
       elementNames = new List<string>();
     }
 
-    public virtual ValueTypeArray<T> AsReadOnly() {
+    public virtual IValueTypeArray AsReadOnly() {
       ValueTypeArray<T> readOnlyValueTypeArray = (ValueTypeArray<T>)this.Clone();
       readOnlyValueTypeArray.readOnly = true;
@@ -153,4 +171,10 @@
     }
 
+    public event EventHandler ResizableChanged;
+    protected virtual void OnResizableChanged() {
+      EventHandler handler = ResizableChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
     public event EventHandler ElementNamesChanged;
     protected virtual void OnElementNamesChanged() {
