diff orange/serialization/Serializer.d @ 30:9d1a8023bb89 experimental

Added IDs to every serialized value.
author Jacob Carlborg <doob@me.com>
date Sun, 21 Nov 2010 17:12:24 +0100
parents c422ff6477dd
children c68d29967c9f
line wrap: on
line diff
--- a/orange/serialization/Serializer.d	Sun Nov 21 16:53:46 2010 +0100
+++ b/orange/serialization/Serializer.d	Sun Nov 21 17:12:24 2010 +0100
@@ -138,33 +138,36 @@
 		return archive.untypedData;
 	}
 	
-	private void serializeInternal (T) (T value, string key = null)
+	private void serializeInternal (T) (T value, string key = null, Id id = Id.max)
 	{
 		if (!key)
 			key = nextKey;
 		
+		if (id == Id.max)
+			id = nextId;
+		
 		archive.beginArchiving();
 		
 		static if ( is(T == typedef) )
-			serializeTypedef(value, key);
+			serializeTypedef(value, key, id);
 		
 		else static if (isObject!(T))
-			serializeObject(value, key);
+			serializeObject(value, key, id);
 
 		else static if (isStruct!(T))
-			serializeStruct(value, key);
+			serializeStruct(value, key, id);
 
 		else static if (isString!(T))
-			serializeString(value, key);
+			serializeString(value, key, id);
 		
 		else static if (isArray!(T))
-			serializeArray(value, key);
+			serializeArray(value, key, id);
 
 		else static if (isAssociativeArray!(T))
-			serializeAssociativeArray(value, key);
+			serializeAssociativeArray(value, key, id);
 
 		else static if (isPrimitive!(T))
-			serializePrimitive(value, key);
+			serializePrimitive(value, key, id);
 
 		else static if (isPointer!(T))
 		{
@@ -172,11 +175,11 @@
 				goto error;
 				
 			else
-				serializePointer(value, key);
+				serializePointer(value, key, id);
 		}			
 		
 		else static if (isEnum!(T))
-			serializeEnum(value, key);
+			serializeEnum(value, key, id);
 		
 		else
 		{
@@ -185,7 +188,7 @@
 		}
 	}
 
-	private void serializeObject (T) (T value, string key)
+	private void serializeObject (T) (T value, string key, Id id)
 	{
 		if (!value)
 			return archive.archiveNull(T.stringof, key);
@@ -197,7 +200,6 @@
 		
 		auto runtimeType = value.classinfo.name;
 		
-		Id id = nextId;
 		addSerializedReference(value, id);
 
 		triggerEvents(serializing, value, {			
@@ -222,12 +224,12 @@
 		});
 	}
 	
-	private void serializeStruct (T) (T value, string key)
+	private void serializeStruct (T) (T value, string key, Id id)
 	{			
 		string type = T.stringof;
 		
 		triggerEvents(serializing, value, {
-			archive.archiveStruct(type, key, nextId, {
+			archive.archiveStruct(type, key, id, {
 				if (type in serializers)
 				{
 					auto wrapper = getSerializerWrapper!(T)(type);
@@ -246,19 +248,17 @@
 		});
 	}
 	
-	private void serializeString (T) (T value, string key)
+	private void serializeString (T) (T value, string key, Id id)
 	{
-		auto id = nextId;
 		auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
 		
 		archive.archive(value, key, id);			
 		addSerializedArray(array, id);
 	}
 	
-	private void serializeArray (T) (T value, string key)
+	private void serializeArray (T) (T value, string key, Id id)
 	{
 		auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
-		auto id = nextId;
 
 		archive.archiveArray(array, arrayToString!(T), key, id, {
 			foreach (i, e ; value)
@@ -268,14 +268,13 @@
 		addSerializedArray(array, id);
 	}
 	
-	private void serializeAssociativeArray (T) (T value, string key)
+	private void serializeAssociativeArray (T) (T value, string key, Id id)
 	{
 		auto reference = getSerializedReference(value);
 		
 		if (reference != Id.max)
 			return archive.archiveReference(key, reference);
-		
-		Id id = nextId;
+
 		addSerializedReference(value, id);
 		
 		string keyType = KeyTypeOfAssociativeArray!(T).stringof;
@@ -299,13 +298,11 @@
 		});
 	}
 	
-	private void serializePointer (T) (T value, string key)
+	private void serializePointer (T) (T value, string key, Id id)
 	{
 		if (!value)
 			return archive.archiveNull(T.stringof, key);
 		
-		Id id = nextId;
-		
 		archive.archivePointer(key, id, {
 			if (key in serializers)
 			{
@@ -329,24 +326,24 @@
 		addSerializedPointer(value, id);
 	}
 	
-	private void serializeEnum (T) (T value, string key)
+	private void serializeEnum (T) (T value, string key, Id id)
 	{
 		alias BaseTypeOfEnum!(T) EnumBaseType;
 		auto val = cast(EnumBaseType) value;
 		string type = T.stringof;
 		
-		archive.archiveEnum(val, type, key, nextId);
+		archive.archiveEnum(val, type, key, id);
 	}
 	
-	private void serializePrimitive (T) (T value, string key)
+	private void serializePrimitive (T) (T value, string key, Id id)
 	{	
-		archive.archive(value, key, nextId);
+		archive.archive(value, key, id);
 	}
 	
-	private void serializeTypedef (T) (T value, string key)
+	private void serializeTypedef (T) (T value, string key, Id id)
 	{
 		archive.archiveTypedef(T.stringof, key, nextId, {
-			serializeInternal!(BaseTypeOfTypedef!(T))(value, nextKey);
+			serializeInternal!(BaseTypeOfTypedef!(T))(value, id);
 		});
 	}
 	
@@ -665,11 +662,12 @@
 			static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
 			{
 				alias typeof(T.tupleof[i]) Type;				
-				Type v = value.tupleof[i];
+				Type v = value.tupleof[i];				
+				auto id = nextId;
 				
-				addSerializedValue(value.tupleof[i], nextId);
-				serializeInternal(v, toData(field));
-			}				
+				addSerializedValue(value.tupleof[i], id);
+				serializeInternal(v, toData(field), id);
+			}
 		}
 		
 		static if (isObject!(T) && !is(T == Object))