annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2 * Copyright: Copyright (c) 2010 Jacob Carlborg.
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 * Version: Initial created: Jan 26, 2010
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module orange.serialization.Serializer;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 version (Tango)
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
10 import tango.util.Convert : to, ConversionException;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
11
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
12 else
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
13 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
14 import std.conv;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
15 alias ConvError ConversionException;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
17
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18 import orange.serialization._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 import orange.util._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 alias orange.util.CTFE.contains ctfeContains;
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
25
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
26 enum Mode
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28 serializing,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 deserializing
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 alias Mode.serializing serializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 alias Mode.deserializing deserializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
36 class Serializer (ArchiveType : IArchive)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
38 static assert(isArchive!(ArchiveType), format!(`The type "`, ArchiveType, `" does not implement the necessary methods to be an archive.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
39
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
40 alias ArchiveType.ErrorCallback ErrorCallback;
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
41 alias ArchiveType.DataType DataType;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
42
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
43 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
44 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
45 ArchiveType archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
47 RegisterBase[string] serializers;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48 RegisterBase[string] deserializers;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 size_t keyCounter;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 bool hasBegunSerializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 bool hasBegunDeserializing;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
54
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
55 void delegate (ArchiveException exception, DataType[] data) throwOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
56 void delegate (ArchiveException exception, DataType[] data) doNothingOnErrorCallback;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
57 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
59 this ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61 archive = new ArchiveType;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
62
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
63 throwOnErrorCallback = (ArchiveException exception, DataType[] data) { throw exception; };
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
64 doNothingOnErrorCallback = (ArchiveException exception, DataType[] data) { /* do nothing */ };
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
65
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
66 setThrowOnErrorCallback();
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
68
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
69 void registerSerializer (T) (string type, void delegate (T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
70 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
71 serializers[type] = toSerializeRegisterWrapper(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
72 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
73
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
74 void registerSerializer (T) (string type, void function (T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
75 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
76 serializers[type] = toSerializeRegisterWrapper(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
77 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
78
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
79 void registerDeserializer (T) (string type, void delegate (ref T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
80 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
81 deserializers[type] = toDeserializeRegisterWrapper(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
82 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
83
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
84 void registerDeserializer (T) (string type, void function (ref T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
85 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
86 deserializers[type] = toDeserializeRegisterWrapper(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
87 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
88
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
89 void reset ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
90 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
91 hasBegunSerializing = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
92 hasBegunDeserializing = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
93 resetCounters();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
94
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
95 archive.reset;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
96 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
97
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
98 ErrorCallback errorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
99 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
100 return archive.errorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
101 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
102
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
103 ErrorCallback errorCallback (ErrorCallback errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
104 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
105 return archive.errorCallback = errorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
106 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
107
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
108 void setThrowOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
109 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
110 errorCallback = throwOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
111 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
112
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
113 void setDoNothingOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
114 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
115 errorCallback = doNothingOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
116 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
117
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
118 DataType serialize (T) (T value, DataType key = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 if (!hasBegunSerializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
121 hasBegunSerializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
122
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
123 serializeInternal(value, key);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
124 archive.postProcess;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
125
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
126 return archive.data;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
127 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
128
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
129 private void serializeInternal (T) (T value, DataType key = null)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
130 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
131 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
132 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
133
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134 archive.beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
135
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
137 serializeTypeDef(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139 static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 serializeObject(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
141
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
142 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 serializeStruct(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
146 serializeString(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
148 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149 serializeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
151 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
152 serializeAssociativeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
154 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
155 serializePrimitive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
156
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
158 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
159 static if (isFunctionPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
160 goto error;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163 serializePointer(value, key);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
164 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
166 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
167 serializeEnum(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
169 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
170 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
171 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
172 throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__);
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
173 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176 private void serializeObject (T) (T value, DataType key)
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
177 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
178 triggerEvents(serializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180 auto runtimeType = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 if (runtimeType in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184 auto wrapper = getSerializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
185 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
187
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
188 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
190
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
191 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
192 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 throw new SerializationException(`The object of the static type "` ~ T.stringof ~ `" have a different runtime type (` ~ runtimeType ~ `) and therefore needs to register a serializer for its type "` ~ runtimeType ~ `".`, __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
196 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
197 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
198 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
199 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
201
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
202 private void serializeStruct (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
203 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
204 triggerEvents(serializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
205 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
206 auto type = toDataType(T.stringof);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208 if (type in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 auto wrapper = getSerializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
212 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
213
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
214 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
215 {
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
216 static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
217 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
220 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
221 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
225
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
226 private void serializeString (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
227 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
228 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
229 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
230
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 private void serializeArray (T) (T value, DataType key)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
232 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
233 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
234 foreach (i, e ; value)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
235 serializeInternal(e, toDataType(i));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
238
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
239 private void serializeAssociativeArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
240 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
241 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
242 foreach(k, v ; value)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
243 serializeInternal(v, toDataType(k));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
244 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
245 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
247 private void serializePointer (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
248 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
249 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
250 if (key in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
251 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252 auto wrapper = getSerializerWrapper!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
254 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
255
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
256 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
259 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261 static if (isVoid!(BaseTypeOfPointer!(T)))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262 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__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264 else
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
265 serializeInternal(*value, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
266 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
267 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
268 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
269
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270 private void serializeEnum (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
271 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
273 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
274
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275 private void serializePrimitive (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
276 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
277 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
278 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
279
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
280 private void serializeTypeDef (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
281 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
282 archive.archive(value, key, {
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
283 serializeInternal!(BaseTypeOfTypeDef!(T))(value, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
284 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
285 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
286
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
287 T deserialize (T) (DataType data, DataType key = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
288 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
289 if (hasBegunSerializing && !hasBegunDeserializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
290 resetCounters();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
291
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
292 if (!hasBegunDeserializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
293 hasBegunDeserializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
294
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
295 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
296 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
297
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
298 archive.beginUnarchiving(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
299 return deserializeInternal!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
300 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302 private T deserializeInternal (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
303 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
304 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
305 return deserializeTypeDef!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
306
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
307 else static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
308 return deserializeObject!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
310 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 return deserializeStruct!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
313 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 return deserializeString!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317 return deserializeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
318
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
320 return deserializeAssociativeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
322 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
323 return deserializePrimitive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
324
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
325 else static if (isPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
326 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
327 static if (isFunctionPointer!(T))
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
328 goto error;
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
329
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330 return deserializePointer!(T)(key);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
331 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
332
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
333 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
334 return deserializeEnum!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
336 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
337 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
338 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
339 throw new SerializationException(format!(`The type "`, T, `" cannot be deserialized.`), __FILE__, __LINE__);
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
340 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 private T deserializeObject (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344 {
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
345 T value = archive.unarchive!(T)(key, (T value) {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
346 triggerEvents(deserializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 auto runtimeType = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349 if (runtimeType in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
350 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
351 auto wrapper = getDeserializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
352 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
353 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
354
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
355 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
359 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
360 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361 throw new SerializationException(`The object of the static type "` ~ T.stringof ~ `" have a different runtime type (` ~ runtimeType ~ `) and therefore needs to register a deserializer for its type "` ~ runtimeType ~ `".`, __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
363 objectStructDeserializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
364 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
365 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
366
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
371 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
373 private T deserializeStruct (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
374 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
375 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 triggerEvents(deserializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377 auto type = toDataType(T.stringof);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379 if (type in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
381 auto wrapper = getDeserializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
382 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386 {
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
387 static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
391 objectStructDeserializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
392 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
393 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
394
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 private T deserializeString (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
401 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
402 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
403
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
404 private T deserializeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
405 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
406 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407 foreach (i, ref e ; value)
14
6e454595b203 Fixed (de)serializing of arrays and associative arrays.
Jacob Carlborg <doob@me.com>
parents: 9
diff changeset
408 e = deserializeInternal!(typeof(e))(toDataType(i));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
409
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
410 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
411 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
412 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
413
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
414 private T deserializeAssociativeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
415 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
416 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
417 foreach (k, v ; archive.unarchiveAssociativeArrayVisitor!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
418 value[k] = v;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
419
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
420 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
421 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
422 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
423
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
424 private T deserializePointer (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
425 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
426 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
427 if (key in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
428 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
429 auto wrapper = getDeserializerWrapper!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
430 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
431 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
432
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
433 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
434 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
435
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
436 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
437 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
438 static if (isVoid!(BaseTypeOfPointer!(T)))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
439 throw new SerializationException(`The value with the key "` ~ to!(string)(key) ~ `"` ~ format!(` of the type "`, T, `" cannot be deserialized on its own, either implement orange.serialization.Serializable.isSerializable or register a deserializer.`), __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
440
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
441 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
442 *value = deserializeInternal!(BaseTypeOfPointer!(T))(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
443 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
444
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
445 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
446 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
447 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
448
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
449 private T deserializeEnum (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
450 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
451 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
452 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
453
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
454 private T deserializePrimitive (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
455 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
456 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
457 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
458
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
459 private T deserializeTypeDef (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
460 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
461 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
462 return deserializeInternal!(BaseTypeOfTypeDef!(T))(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
463 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
464 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
465
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
466 private void objectStructSerializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
467 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
468 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.`));
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
469 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
470
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
471 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
472 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
473 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
474
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
475 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
476 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
477 alias typeof(T.tupleof[i]) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
478 Type v = value.tupleof[i];
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
479 serializeInternal(v, toDataType(field));
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
480 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
481 }
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
482
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
483 static if (isObject!(T) && !is(T == Object))
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
484 serializeBaseTypes(value);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
485 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
486
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
487 private void objectStructDeserializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
488 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
489 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.`));
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
490 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
491
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
492 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
493 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
494 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
495
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
496 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
497 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
498 alias TypeOfField!(T, field) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
499 auto fieldValue = deserializeInternal!(Type)(toDataType(field));
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
500 value.tupleof[i] = fieldValue;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
501 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
502 }
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
503
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
504 static if (isObject!(T) && !is(T == Object))
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
505 deserializeBaseTypes(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
506 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
507
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
508 private void serializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
511
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
513 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
514 archive.archiveBaseClass!(Base)(nextKey);
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
515 Base base = value;
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
516 objectStructSerializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
517 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
519
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
520 private void deserializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
521 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
522 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
523
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
524 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
525 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
526 archive.unarchiveBaseClass!(Base)(nextKey);
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
527 Base base = value;
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
528 objectStructDeserializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
529 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
530 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
531
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
532 private SerializeRegisterWrapper!(T, Serializer) getSerializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
533 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
534 auto wrapper = cast(SerializeRegisterWrapper!(T, Serializer)) serializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
535
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
536 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
537 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
538
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
539 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
540 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
541
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
542 private DeserializeRegisterWrapper!(T, Serializer) getDeserializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
543 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
544 auto wrapper = cast(DeserializeRegisterWrapper!(T, Serializer)) deserializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
545
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
546 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
547 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
548
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
550 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
551
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
552 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void delegate (T, Serializer, DataType) dg)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
553 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
554 return new SerializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
555 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
556
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
557 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void function (T, Serializer, DataType) func)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
558 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
559 return new SerializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
560 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
561
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
562 private DeserializeRegisterWrapper!(T, Serializer) toDeserializeRegisterWrapper (T) (void delegate (ref T, Serializer, DataType) dg)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
563 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
564 return new DeserializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
565 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
566
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
567 private DeserializeRegisterWrapper!(T, Serializer) toDeserializeRegisterWrapper (T) (void function (ref T, Serializer, DataType) func)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
568 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
569 return new DeserializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572 private DataType toDataType (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 try
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
575 return to!(DataType)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
576
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
577 catch (ConversionException e)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
578 throw new SerializationException(e);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
579 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
580
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
581 private bool isBaseClass (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
582 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
583 auto name = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
584 auto index = name.lastIndexOf('.');
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
585
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
586 return T.stringof != name[index + 1 .. $];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
587 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
588
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
589 private DataType nextKey ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
590 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
591 return toDataType(keyCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
592 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
593
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
594 private void resetCounters ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
595 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
596 keyCounter = 0;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
597 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
598
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
599 private void triggerEvent (string name, T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
600 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
601 static assert (isObject!(T) || isStruct!(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.`));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
602
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
603 foreach (i, dummy ; typeof(T.tupleof))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
604 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
605 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
606
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
607 static if (field == name)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
608 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
609 alias TypeOfField!(T, field) Type;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
610 auto event = getValueOfField!(T, Type, field)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
611 event(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
612 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
613 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
614 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
615
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
616 private void triggerEvents (T) (Mode mode, T value, void delegate () dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
618 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
619 triggerEvent!(onSerializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
621 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
622 triggerEvent!(onDeserializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
624 dg();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
625
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
626 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
627 triggerEvent!(onSerializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
628
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
629 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
630 triggerEvent!(onDeserializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
631 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
632
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
633 private static string[] collectAnnotations (string name, T) ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
634 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
635 static assert (isObject!(T) || isStruct!(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.`));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
636
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
637 string[] annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
638
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
639 foreach (i, type ; typeof(T.tupleof))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
640 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
641 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
642
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
643 static if (field == name)
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
644 annotations ~= type.field;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
645 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
646
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
647 return annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
648 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
649 }