Mercurial > projects > orange
diff orange/serialization/Serializer.d @ 29:c422ff6477dd experimental
Better handling of serializing pointers.
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Sun, 21 Nov 2010 16:53:46 +0100 |
parents | bffcbc8c392b |
children | 9d1a8023bb89 |
line wrap: on
line diff
--- a/orange/serialization/Serializer.d Fri Nov 19 11:55:04 2010 +0100 +++ b/orange/serialization/Serializer.d Sun Nov 21 16:53:46 2010 +0100 @@ -65,6 +65,9 @@ Array[Id] serializedArrays; void[][Id] deserializedSlices; + Id[void*] serializedPointers; + Id[void*] serializedValues; + bool hasBegunSerializing; bool hasBegunDeserializing; @@ -115,6 +118,9 @@ serializedArrays = null; deserializedSlices = null; + serializedValues = null; + serializedPointers = null; + hasBegunSerializing = false; hasBegunDeserializing = false; @@ -298,14 +304,7 @@ if (!value) return archive.archiveNull(T.stringof, key); - auto reference = getSerializedReference(value); - - if (reference != Id.max) - return archive.archiveReference(key, reference); - Id id = nextId; - - addSerializedReference(value, id); archive.archivePointer(key, id, { if (key in serializers) @@ -326,6 +325,8 @@ serializeInternal(*value, nextKey); } }); + + addSerializedPointer(value, id); } private void serializeEnum (T) (T value, string key) @@ -665,6 +666,8 @@ { alias typeof(T.tupleof[i]) Type; Type v = value.tupleof[i]; + + addSerializedValue(value.tupleof[i], nextId); serializeInternal(v, toData(field)); } } @@ -739,6 +742,16 @@ deserializedSlices[id] = value; } + private void addSerializedValue (T) (ref T value, Id id) + { + serializedValues[&value] = id; + } + + private void addSerializedPointer (T) (T value, Id id) + { + serializedPointers[value] = id; + } + private Id getSerializedReference (T) (T value) { if (auto tmp = cast(void*) value in serializedReferences) @@ -769,6 +782,14 @@ return cast(T*) array; } + private Id getSerializedPointer (T) (T value) + { + if (auto tmp = cast(void*) value in serializedPointers) + return *tmp; + + return Id.max; + } + private T[] toSlice (T) (T[] array, Slice slice) { return array[slice.offset .. slice.offset + slice.length]; @@ -819,6 +840,12 @@ serializedArrays[id] = array; } + private void postProcess () + { + postProcessArrays(); + postProcessPointers(); + } + private void postProcessArrays () { bool foundSlice = true; @@ -844,9 +871,16 @@ } } - private void postProcess () + private void postProcessPointers () { - postProcessArrays(); + foreach (key, pointerId ; serializedPointers) + { + if (auto pointeeId = key in serializedValues) + archive.archivePointer(pointerId, *pointeeId); + + else + archive.postProcessPointer(pointerId); + } } private template arrayToString (T)