Mercurial > projects > orange
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)); } }