changeset 4:470ab5270d0c

Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
author Jacob Carlborg <doob@me.com>
date Mon, 31 May 2010 19:20:14 +0200
parents 3c155e4c3d56
children aeb98df0a159
files orange/serialization/RegisterWrapper.d orange/serialization/Serializer.d
diffstat 2 files changed, 21 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/orange/serialization/RegisterWrapper.d	Mon May 31 18:51:56 2010 +0200
+++ b/orange/serialization/RegisterWrapper.d	Mon May 31 19:20:14 2010 +0200
@@ -19,25 +19,26 @@
 	private alias Serializer!(ArchiveType) SerializerType;
 	private alias SerializerType.DataType DataType;
 	private void delegate (T, SerializerType, DataType) dg;
-	private void function (T, SerializerType, DataType) func;
+	private bool isDelegate;
 
 	this (void delegate (T, SerializerType, DataType) dg)
 	{
+		isDelegate = true;
 		this.dg = dg;
 	}
 
 	this (void function (T, SerializerType, DataType) func)
 	{
-		this.func = func;
+		dg.funcptr = func;
 	}
 
 	void opCall (T value, SerializerType archive, DataType key)
 	{
-		if (dg)
+		if (dg && isDelegate)
 			dg(value, archive, key);
 		
-		else if (func)
-			func(value, archive, key);
+		else if (dg)
+			dg.funcptr(value, archive, key);
 	}
 }
 
@@ -46,24 +47,25 @@
 	private alias Serializer!(ArchiveType) SerializerType;
 	private alias SerializerType.DataType DataType;
 	private void delegate (ref T, SerializerType, DataType) dg;
-	private void function (ref T, SerializerType, DataType) func;
+	private bool isDelegate;
 
 	this (void delegate (ref T, SerializerType, DataType) dg)
 	{
+		isDelegate = true;
 		this.dg = dg;
 	}
 
 	this (void function (ref T, SerializerType, DataType) func)
 	{
-		this.func = func;
+		dg.funcptr = func;
 	}
 
 	void opCall (ref T value, SerializerType archive, DataType key)
 	{
-		if (dg)
+		if (dg && isDelegate)
 			dg(value, archive, key);
 		
-		if (func)
-			func(value, archive, key);
+		if (dg)
+			dg.funcptr(value, archive, key);
 	}
 }
\ No newline at end of file
--- a/orange/serialization/Serializer.d	Mon May 31 18:51:56 2010 +0200
+++ b/orange/serialization/Serializer.d	Mon May 31 19:20:14 2010 +0200
@@ -423,25 +423,6 @@
 		});
 	}
 	
-	private void objectStructSerializeHelper (T : Object) (T value)
-	{
-		const nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
-		
-		foreach (i, dummy ; typeof(T.tupleof))
-		{
-			const field = nameOfFieldAt!(T, i);
-			
-			static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
-			{
-				alias typeof(T.tupleof[i]) Type;				
-				Type v = value.tupleof[i];
-				serialize(v, toDataType(field));
-			}				
-		}
-		
-		serializeBaseTypes(value);
-	}
-	
 	private void objectStructSerializeHelper (T) (ref T value)
 	{
 		static assert(isStruct!(T) || isObject!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
@@ -458,25 +439,9 @@
 				serialize(v, toDataType(field));
 			}				
 		}
-	}
-	
-	private void objectStructDeserializeHelper (T : Object) (T value)
-	{		
-		const nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
 		
-		foreach (i, dummy ; typeof(T.tupleof))
-		{
-			const field = nameOfFieldAt!(T, i);
-						
-			static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
-			{
-				alias TypeOfField!(T, field) Type;
-				auto fieldValue = deserializeInternal!(Type)(toDataType(field));
-				value.tupleof[i] = fieldValue;
-			}			
-		}
-		
-		deserializeBaseTypes(value);
+		static if (isObject!(T) && !is(T == Object))
+			serializeBaseTypes(value);
 	}
 	
 	private void objectStructDeserializeHelper (T) (ref T value)
@@ -495,6 +460,9 @@
 				value.tupleof[i] = fieldValue;
 			}			
 		}
+		
+		static if (isObject!(T) && !is(T == Object))
+			deserializeBaseTypes(value);
 	}
 	
 	private void serializeBaseTypes (T : Object) (T value)
@@ -504,7 +472,8 @@
 		static if (!is(Base == Object))
 		{
 			archive.archiveBaseClass!(Base)(nextKey);
-			objectStructSerializeHelper!(Base)(value);
+			Base base = value;
+			objectStructSerializeHelper(base);
 		}
 	}
 	
@@ -515,7 +484,8 @@
 		static if (!is(Base == Object))
 		{
 			archive.unarchiveBaseClass!(Base)(nextKey);
-			objectStructDeserializeHelper!(Base)(value);
+			Base base = value;
+			objectStructDeserializeHelper(base);
 		}
 	}