Index: /branches/New Persistence Exploration/Persistence/Persistence/DeSerializer.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/DeSerializer.cs	(revision 1316)
+++ /branches/New Persistence Exploration/Persistence/Persistence/DeSerializer.cs	(revision 1317)
@@ -98,5 +98,5 @@
       CompositeStart start = (CompositeStart)token;
       object instance = null;
-      if (this.FindCustomSerializer(start.Type) != null) {
+      if (this.FindCompoundSerializer(start.Type) != null) {
         instance = new ParentReference();
         compositeStack.Push(new CustomObject(instance));
@@ -112,5 +112,5 @@
     private void CompositeEndHandler(IParseToken token) {
       CompositeEnd end = (CompositeEnd)token;
-      ICompoundSerializer customSerializer = this.FindCustomSerializer(end.Type);
+      ICompoundSerializer customSerializer = this.FindCompoundSerializer(end.Type);
       if (customSerializer != null) {
         CustomObject customObject = (CustomObject)compositeStack.Pop();
@@ -124,5 +124,5 @@
       }
     }
-    private ICompoundSerializer FindCustomSerializer(Type type) {
+    private ICompoundSerializer FindCompoundSerializer(Type type) {
       foreach (ICompoundSerializer serializer in customSerializers) {
         if (serializer.CanSerialize(type))
Index: /branches/New Persistence Exploration/Persistence/Persistence/NewSerializationTest.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/NewSerializationTest.cs	(revision 1316)
+++ /branches/New Persistence Exploration/Persistence/Persistence/NewSerializationTest.cs	(revision 1317)
@@ -21,4 +21,14 @@
     [Storable]
     public List<Root> selfReferences;
+    [Storable]
+    public double[,] multiDimArray = new double[,] { { 1, 2, 3 }, { 3, 4, 5 } };
+    [Storable]
+    public bool boolean = true;
+    [Storable]
+    public DateTime dateTime = new DateTime();
+    [Storable]
+    public KeyValuePair<string, int> kvp = new KeyValuePair<string, int>("test key", 123);
+    [Storable]
+    public Dictionary<string, int> dict = new Dictionary<string, int>();
   }
 
@@ -40,9 +50,21 @@
       r.c = new Custom();
       r.c.r = r;
-      IPrimitiveSerializer[] serializers = {
+      r.dict.Add("one", 1);
+      r.dict.Add("two", 2);
+      r.dict.Add("three", 3);
+
+      Serializer s = new Serializer(r,
+        new IPrimitiveSerializer[] {
           new String2XMLSerializer(),
           new Int2XMLSerializer(),
-          new Double2XmlSerializer()};
-      Serializer s = new Serializer(r, serializers);
+          new Double2XmlSerializer(),
+          new Boolean2XmlSerializer(),
+          new DateTime2XmlSerializer(),
+        }, new ICompoundSerializer[] {
+          new EnumerableSerializer(),
+          new ArraySerializer(),
+          new KeyValuePair2XmlSerializer(),
+          new Dictionary2XmlSerializer(),
+        });      
       Persistence.XmlFormatter xmlFormatter = new Persistence.XmlFormatter();
       StreamWriter writer = new StreamWriter("test.xml");
@@ -59,8 +81,13 @@
           new String2XMLSerializer(),
           new Double2XmlSerializer(),
+          new Boolean2XmlSerializer(),
+          new DateTime2XmlSerializer(),
         },
         new ICompoundSerializer[] { 
           new ArraySerializer(),
-          new EnumerableSerializer() });
+          new EnumerableSerializer(),
+          new KeyValuePair2XmlSerializer(),
+          new Dictionary2XmlSerializer(),
+        });      
       object o = deSerializer.DeSerialize(parser);
       Console.Out.WriteLine(Util.AutoFormat(o, true));
Index: /branches/New Persistence Exploration/Persistence/Persistence/Serializer.cs
===================================================================
--- /branches/New Persistence Exploration/Persistence/Persistence/Serializer.cs	(revision 1316)
+++ /branches/New Persistence Exploration/Persistence/Persistence/Serializer.cs	(revision 1317)
@@ -11,10 +11,14 @@
     private Dictionary<object, int> obj2id;
     private Dictionary<Type, IPrimitiveSerializer> primitiveSerializers;
-    private List<ICompoundSerializer> customSerializers;
+    private List<ICompoundSerializer> compoundSerializers;
 
-    public Serializer(object obj, IEnumerable<IPrimitiveSerializer> primitiveSerializers) :
-      this(obj, primitiveSerializers, "ROOT") { }
+    public Serializer(object obj,
+        IEnumerable<IPrimitiveSerializer> primitiveSerializers,
+        IEnumerable<ICompoundSerializer> compoundSerializers) :
+      this(obj, primitiveSerializers, compoundSerializers, "ROOT") { }
 
-    public Serializer(object obj, IEnumerable<IPrimitiveSerializer> primitiveSerializers, string rootName) {
+    public Serializer(object obj,
+        IEnumerable<IPrimitiveSerializer> primitiveSerializers,
+        IEnumerable<ICompoundSerializer> compoundSerializers, string rootName) {
       this.obj = obj;
       this.rootName = rootName;
@@ -23,7 +27,5 @@
         this.primitiveSerializers.Add(serializer.Type, serializer);
       }
-      this.customSerializers = new List<ICompoundSerializer>();
-      customSerializers.Add(new EnumerableSerializer());
-      customSerializers.Add(new ArraySerializer());
+      this.compoundSerializers = new List<ICompoundSerializer>(compoundSerializers);
       this.obj2id = new Dictionary<object, int>();
       obj2id.Add(new object(), 0);
@@ -54,5 +56,5 @@
         this.obj2id.Add(value, id);
         yield return new BeginToken(accessor, id);
-        ICompoundSerializer customSerializer = this.FindCustomSerializer(value.GetType());
+        ICompoundSerializer customSerializer = this.FindCompoundSerializer(value.GetType());
         if (customSerializer != null) {
           foreach (object obj in customSerializer.Serialize(value)) {
@@ -62,9 +64,17 @@
           }
         } else { // composite serialization
+          int nSubComponents = 0;
           foreach (KeyValuePair<string, DataMemberAccessor> mapping in
             StorableAttribute.GetAutostorableAccessors(value)) {
-            IEnumerator<ISerializationToken> iterator = this.Serialize(mapping.Value);
-            while (iterator.MoveNext())
+            nSubComponents += 1;
+            IEnumerator<ISerializationToken> iterator = this.Serialize(mapping.Value);                        
+            while (iterator.MoveNext()) {                            
               yield return iterator.Current;
+            }                        
+          }
+          if (nSubComponents == 0) {
+            throw new ApplicationException(String.Format(
+              "Composite value of type \"{0}\" contains no subcomponents",
+              value.GetType().FullName));
           }
         }
@@ -73,6 +83,6 @@
     }
 
-    private ICompoundSerializer FindCustomSerializer(Type type) {
-      foreach (ICompoundSerializer s in customSerializers) {
+    private ICompoundSerializer FindCompoundSerializer(Type type) {
+      foreach (ICompoundSerializer s in compoundSerializers) {
         if (s.CanSerialize(type))
           return s;
