# HG changeset patch # User Jacob Carlborg # Date 1275326414 -7200 # Node ID 470ab5270d0c339f766e90e49cfb398e746f69e8 # Parent 3c155e4c3d56d6e1f55b316a4f6e9c6fa19218f4 Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized diff -r 3c155e4c3d56 -r 470ab5270d0c orange/serialization/RegisterWrapper.d --- 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 diff -r 3c155e4c3d56 -r 470ab5270d0c orange/serialization/Serializer.d --- 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); } }