diff orange/serialization/Serializer.d @ 20:9a575087b961

Added support for slices. Strings and arrays are now treated as references.
author Jacob Carlborg <doob@me.com>
date Mon, 04 Oct 2010 18:27:21 +0200
parents 3d42ea434d46
children b51e953f79eb
line wrap: on
line diff
--- a/orange/serialization/Serializer.d	Thu Aug 12 23:24:51 2010 +0200
+++ b/orange/serialization/Serializer.d	Mon Oct 04 18:27:21 2010 +0200
@@ -22,8 +22,8 @@
 private
 {
 	alias orange.util.CTFE.contains ctfeContains;
-	
-	private enum Mode
+
+	enum Mode
 	{
 		serializing,
 		deserializing
@@ -38,7 +38,7 @@
 	static assert(isArchive!(ArchiveType), format!(`The type "`, ArchiveType, `" does not implement the necessary methods to be an archive.`));
 	
 	alias ArchiveType.ErrorCallback ErrorCallback;
-	alias ArchiveType.DataType DataType;
+	alias ArchiveType.DataType DataType;	
 	
 	private
 	{
@@ -120,6 +120,14 @@
 		if (!hasBegunSerializing)
 			hasBegunSerializing = true;
 		
+		serializeInternal(value, key);
+		archive.postProcess;
+
+		return archive.data;
+	}
+	
+	private void serializeInternal (T) (T value, DataType key = null)
+	{
 		if (!key)
 			key = nextKey;
 		
@@ -163,8 +171,6 @@
 			error:
 			throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__);
 		}
-		
-		return archive.data;
 	}
 	
 	private void serializeObject (T) (T value, DataType key)
@@ -223,10 +229,10 @@
 	}
 
 	private void serializeArray (T) (T value, DataType key)
-	{		
+	{
 		archive.archive(value, key, {
 			foreach (i, e ; value)
-				serialize(e, toDataType(i));
+				serializeInternal(e, toDataType(i));
 		});
 	}
 
@@ -234,7 +240,7 @@
 	{
 		archive.archive(value, key, {
 			foreach(k, v ; value)
-				serialize(v, toDataType(k));
+				serializeInternal(v, toDataType(k));
 		});
 	}
 
@@ -256,7 +262,7 @@
 					throw new SerializationException(`The value with the key "` ~ to!(string)(key) ~ `"` ~ format!(` of the type "`, T, `" cannot be serialized on its own, either implement orange.serialization.Serializable.isSerializable or register a serializer.`), __FILE__, __LINE__);
 				
 				else
-					serialize(*value, key);
+					serializeInternal(*value, key);
 			}				
 		});
 	}
@@ -274,7 +280,7 @@
 	private void serializeTypeDef (T) (T value, DataType key)
 	{
 		archive.archive(value, key, {
-			serialize!(BaseTypeOfTypeDef!(T))(value, key);
+			serializeInternal!(BaseTypeOfTypeDef!(T))(value, key);
 		});
 	}
 	
@@ -470,7 +476,7 @@
 			{
 				alias typeof(T.tupleof[i]) Type;				
 				Type v = value.tupleof[i];
-				serialize(v, toDataType(field));
+				serializeInternal(v, toDataType(field));
 			}				
 		}