Index: branches/Persistence Test/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/StructSerializer.cs
===================================================================
--- branches/Persistence Test/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/StructSerializer.cs	(revision 2937)
+++ branches/Persistence Test/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/StructSerializer.cs	(revision 2937)
@@ -0,0 +1,59 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Interfaces;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Reflection;
+using HeuristicLab.Persistence.Core;
+
+namespace HeuristicLab.Persistence.Default.CompositeSerializers {
+
+  [EmptyStorableClass]
+  public class StructSerializer : ICompositeSerializer {    
+
+    public int Priority {
+      get { return 50; }
+    }
+
+    public bool CanSerialize(Type type) {
+      return type.IsValueType && !type.IsPrimitive && !type.IsEnum && type.IsSealed;      
+    }
+
+    public IEnumerable<Tag> CreateMetaInfo(object obj) {
+      return null;
+    }
+
+    private readonly BindingFlags AllInstanceMembers =
+      BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
+
+    public IEnumerable<Tag> Decompose(object obj) {
+      Type t = obj.GetType();
+      foreach (MemberInfo mi in t.GetMembers(AllInstanceMembers)) {
+        if (mi.MemberType == MemberTypes.Field) {
+          string name = mi.Name.Replace("<", "&lt;").Replace(">", "&gt;");          
+          yield return new Tag(name, ((FieldInfo)mi).GetValue(obj));
+        }
+      }
+    }
+
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
+      return Activator.CreateInstance(type, true);
+    }
+
+    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {
+      foreach (Tag t in tags) {
+        string name = t.Name.Replace("&lt;", "<").Replace("&gt;", ">");
+        MemberInfo[] mis = type.GetMember(name, AllInstanceMembers);
+        if (mis.Length != 1)
+          throw new PersistenceException("ambiguous struct member name " + name);
+        MemberInfo mi = mis[0];
+        if (mi.MemberType == MemberTypes.Field)
+          ((FieldInfo)mi).SetValue(instance, t.Value);        
+        else
+          throw new PersistenceException("invalid struct member type " + mi.MemberType.ToString());
+      }
+    }
+    
+  }
+}
Index: branches/Persistence Test/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj
===================================================================
--- branches/Persistence Test/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj	(revision 2858)
+++ branches/Persistence Test/HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj	(revision 2937)
@@ -117,4 +117,5 @@
     <Compile Include="Default\CompositeSerializers\Storable\StorableAttribute.cs" />
     <Compile Include="Default\CompositeSerializers\Storable\StorableSerializer.cs" />
+    <Compile Include="Default\CompositeSerializers\StructSerializer.cs" />
     <Compile Include="Default\CompositeSerializers\TypeSerializer.cs" />
     <Compile Include="Default\DebugString\DebugString.cs" />
Index: branches/Persistence Test/HeuristicLab.Persistence/UnitTests/HeuristicLab.Persistence.UnitTest.csproj
===================================================================
--- branches/Persistence Test/HeuristicLab.Persistence/UnitTests/HeuristicLab.Persistence.UnitTest.csproj	(revision 2858)
+++ branches/Persistence Test/HeuristicLab.Persistence/UnitTests/HeuristicLab.Persistence.UnitTest.csproj	(revision 2937)
@@ -69,4 +69,5 @@
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
     </Reference>
+    <Reference Include="System.Drawing" />
   </ItemGroup>
   <ItemGroup>
Index: branches/Persistence Test/HeuristicLab.Persistence/UnitTests/UseCases.cs
===================================================================
--- branches/Persistence Test/HeuristicLab.Persistence/UnitTests/UseCases.cs	(revision 2858)
+++ branches/Persistence Test/HeuristicLab.Persistence/UnitTests/UseCases.cs	(revision 2937)
@@ -17,4 +17,5 @@
 using System.Text.RegularExpressions;
 using HeuristicLab.Persistence.Test;
+using System.Drawing;
 
 namespace HeuristicLab.Persistence.UnitTest {
@@ -581,4 +582,40 @@
     }
 
+    struct TestStruct {
+      int value;
+      int PropertyValue { get; set; }
+      public TestStruct(int value) : this() {
+        this.value = value;
+        PropertyValue = value;
+      }      
+    }
+
+    [TestMethod]
+    public void StructTest() {
+      TestStruct s = new TestStruct(10);
+      XmlGenerator.Serialize(s, tempFile);
+      TestStruct newS = (TestStruct)XmlParser.Deserialize(tempFile);
+      Assert.AreEqual(s, newS);
+    }
+    
+    [TestMethod]
+    public void PointTest() {
+      Point p = new Point(12, 34);
+      XmlGenerator.Serialize(p, tempFile);
+      Point newP = (Point)XmlParser.Deserialize(tempFile);
+      Assert.AreEqual(p, newP);
+    }
+
+    [TestMethod]
+    public void NullableValueTypes() {
+      double?[] d = new double?[] { null, 1, 2, 3 };      
+      XmlGenerator.Serialize(d, tempFile);
+      double?[] newD = (double?[])XmlParser.Deserialize(tempFile);
+      Assert.AreEqual(d[0], newD[0]);
+      Assert.AreEqual(d[1], newD[1]);
+      Assert.AreEqual(d[2], newD[2]);
+      Assert.AreEqual(d[3], newD[3]);
+    }
+
     [ClassInitialize]
     public static void Initialize(TestContext testContext) {
