Index: /stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Number2StringSerializer.cs
===================================================================
--- /stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Number2StringSerializer.cs	(revision 11372)
+++ /stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Number2StringSerializer.cs	(revision 11373)
@@ -78,5 +78,5 @@
     /// </returns>
     public bool CanSerialize(Type type) {
-      return numberSerializerMap.ContainsKey(type);
+      return numberSerializerMap.ContainsKey(Nullable.GetUnderlyingType(type) ?? type);
     }
 
@@ -90,5 +90,5 @@
     /// </returns>
     public string JustifyRejection(Type type) {
-      return string.Format("not a number type (one of {0})",
+      return string.Format("not a (nullable) number type (one of {0})",
         string.Join(", ", numberSerializers.Select(n => n.SourceType.Name).ToArray()));
     }
@@ -100,5 +100,7 @@
     /// <returns></returns>
     public string Format(object obj) {
-      return ((XmlString)numberSerializerMap[obj.GetType()].Format(obj)).Data;
+      if (obj == null) return "null";
+      Type type = obj.GetType();
+      return ((XmlString)numberSerializerMap[Nullable.GetUnderlyingType(type) ?? type].Format(obj)).Data;
     }
 
@@ -110,6 +112,7 @@
     /// <returns></returns>
     public object Parse(string stringValue, Type type) {
+      if (stringValue == "null") return null;
       try {
-        return numberSerializerMap[type].Parse(new XmlString(stringValue));
+        return numberSerializerMap[Nullable.GetUnderlyingType(type) ?? type].Parse(new XmlString(stringValue));
       }
       catch (FormatException e) {
Index: /stable/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCases.cs
===================================================================
--- /stable/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCases.cs	(revision 11372)
+++ /stable/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCases.cs	(revision 11373)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -24,4 +24,5 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.Globalization;
 using System.IO;
 using System.Linq;
@@ -1441,4 +1442,79 @@
     }
 
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestSpecialCharacters() {
+      var s = "abc" + "\x15" + "def";
+      XmlGenerator.Serialize(s, tempFile);
+      var newS = XmlParser.Deserialize(tempFile);
+      Assert.AreEqual(s, newS);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestByteArray() {
+      var b = new byte[3];
+      b[0] = 0;
+      b[1] = 200;
+      b[2] = byte.MaxValue;
+      XmlGenerator.Serialize(b, tempFile);
+      var newB = (byte[]) XmlParser.Deserialize(tempFile);
+      CollectionAssert.AreEqual(b, newB);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestOptionalNumberEnumerable() {
+      var values = new List<double?> {0, null, double.NaN, double.PositiveInfinity, double.MaxValue, 1};
+      XmlGenerator.Serialize(values, tempFile);
+      var newValues = (List<double?>) XmlParser.Deserialize(tempFile);
+      CollectionAssert.AreEqual(values, newValues);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestOptionalDateTimeEnumerable() {
+      var values = new List<DateTime?> { DateTime.MinValue, null, DateTime.Now, DateTime.Now.Add(TimeSpan.FromDays(1)),
+        DateTime.ParseExact("10.09.2014 12:21", "dd.MM.yyyy hh:mm", CultureInfo.InvariantCulture), DateTime.MaxValue};
+      XmlGenerator.Serialize(values, tempFile);
+      var newValues = (List<DateTime?>) XmlParser.Deserialize(tempFile);
+      CollectionAssert.AreEqual(values, newValues);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestStringEnumerable() {
+      var values = new List<string> {"", null, "s", "string", string.Empty, "123", "<![CDATA[nice]]>", "<![CDATA[nasty unterminated"};
+      XmlGenerator.Serialize(values, tempFile);
+      var newValues = (List<String>) XmlParser.Deserialize(tempFile);
+      CollectionAssert.AreEqual(values, newValues);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestUnicodeCharArray() {
+      var s = Encoding.UTF8.GetChars(new byte[] {0, 1, 2, 03, 04, 05, 06, 07, 08, 09, 0xa, 0xb});
+      XmlGenerator.Serialize(s, tempFile);
+      var newS = (char[])XmlParser.Deserialize(tempFile);
+      CollectionAssert.AreEqual(s, newS);
+    }
+
+    [TestMethod]
+    [TestCategory("Persistence")]
+    [TestProperty("Time", "short")]
+    public void TestUnicode() {
+      var s = Encoding.UTF8.GetString(new byte[] {0, 1, 2, 03, 04, 05, 06, 07, 08, 09, 0xa, 0xb});
+      XmlGenerator.Serialize(s, tempFile);
+      var newS = XmlParser.Deserialize(tempFile);
+      Assert.AreEqual(s, newS);
+    }
+
+
     [ClassInitialize]
     public static void Initialize(TestContext testContext) {
