Mercurial > projects > orange
comparison orange/serialization/Serializer.d @ 30:9d1a8023bb89 experimental
Added IDs to every serialized value.
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Sun, 21 Nov 2010 17:12:24 +0100 |
parents | c422ff6477dd |
children | c68d29967c9f |
comparison
equal
deleted
inserted
replaced
29:c422ff6477dd | 30:9d1a8023bb89 |
---|---|
136 postProcess; | 136 postProcess; |
137 | 137 |
138 return archive.untypedData; | 138 return archive.untypedData; |
139 } | 139 } |
140 | 140 |
141 private void serializeInternal (T) (T value, string key = null) | 141 private void serializeInternal (T) (T value, string key = null, Id id = Id.max) |
142 { | 142 { |
143 if (!key) | 143 if (!key) |
144 key = nextKey; | 144 key = nextKey; |
145 | 145 |
146 if (id == Id.max) | |
147 id = nextId; | |
148 | |
146 archive.beginArchiving(); | 149 archive.beginArchiving(); |
147 | 150 |
148 static if ( is(T == typedef) ) | 151 static if ( is(T == typedef) ) |
149 serializeTypedef(value, key); | 152 serializeTypedef(value, key, id); |
150 | 153 |
151 else static if (isObject!(T)) | 154 else static if (isObject!(T)) |
152 serializeObject(value, key); | 155 serializeObject(value, key, id); |
153 | 156 |
154 else static if (isStruct!(T)) | 157 else static if (isStruct!(T)) |
155 serializeStruct(value, key); | 158 serializeStruct(value, key, id); |
156 | 159 |
157 else static if (isString!(T)) | 160 else static if (isString!(T)) |
158 serializeString(value, key); | 161 serializeString(value, key, id); |
159 | 162 |
160 else static if (isArray!(T)) | 163 else static if (isArray!(T)) |
161 serializeArray(value, key); | 164 serializeArray(value, key, id); |
162 | 165 |
163 else static if (isAssociativeArray!(T)) | 166 else static if (isAssociativeArray!(T)) |
164 serializeAssociativeArray(value, key); | 167 serializeAssociativeArray(value, key, id); |
165 | 168 |
166 else static if (isPrimitive!(T)) | 169 else static if (isPrimitive!(T)) |
167 serializePrimitive(value, key); | 170 serializePrimitive(value, key, id); |
168 | 171 |
169 else static if (isPointer!(T)) | 172 else static if (isPointer!(T)) |
170 { | 173 { |
171 static if (isFunctionPointer!(T)) | 174 static if (isFunctionPointer!(T)) |
172 goto error; | 175 goto error; |
173 | 176 |
174 else | 177 else |
175 serializePointer(value, key); | 178 serializePointer(value, key, id); |
176 } | 179 } |
177 | 180 |
178 else static if (isEnum!(T)) | 181 else static if (isEnum!(T)) |
179 serializeEnum(value, key); | 182 serializeEnum(value, key, id); |
180 | 183 |
181 else | 184 else |
182 { | 185 { |
183 error: | 186 error: |
184 throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__); | 187 throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__); |
185 } | 188 } |
186 } | 189 } |
187 | 190 |
188 private void serializeObject (T) (T value, string key) | 191 private void serializeObject (T) (T value, string key, Id id) |
189 { | 192 { |
190 if (!value) | 193 if (!value) |
191 return archive.archiveNull(T.stringof, key); | 194 return archive.archiveNull(T.stringof, key); |
192 | 195 |
193 auto reference = getSerializedReference(value); | 196 auto reference = getSerializedReference(value); |
195 if (reference != Id.max) | 198 if (reference != Id.max) |
196 return archive.archiveReference(key, reference); | 199 return archive.archiveReference(key, reference); |
197 | 200 |
198 auto runtimeType = value.classinfo.name; | 201 auto runtimeType = value.classinfo.name; |
199 | 202 |
200 Id id = nextId; | |
201 addSerializedReference(value, id); | 203 addSerializedReference(value, id); |
202 | 204 |
203 triggerEvents(serializing, value, { | 205 triggerEvents(serializing, value, { |
204 archive.archiveObject(runtimeType, T.stringof, key, id, { | 206 archive.archiveObject(runtimeType, T.stringof, key, id, { |
205 if (runtimeType in serializers) | 207 if (runtimeType in serializers) |
220 } | 222 } |
221 }); | 223 }); |
222 }); | 224 }); |
223 } | 225 } |
224 | 226 |
225 private void serializeStruct (T) (T value, string key) | 227 private void serializeStruct (T) (T value, string key, Id id) |
226 { | 228 { |
227 string type = T.stringof; | 229 string type = T.stringof; |
228 | 230 |
229 triggerEvents(serializing, value, { | 231 triggerEvents(serializing, value, { |
230 archive.archiveStruct(type, key, nextId, { | 232 archive.archiveStruct(type, key, id, { |
231 if (type in serializers) | 233 if (type in serializers) |
232 { | 234 { |
233 auto wrapper = getSerializerWrapper!(T)(type); | 235 auto wrapper = getSerializerWrapper!(T)(type); |
234 wrapper(value, this, key); | 236 wrapper(value, this, key); |
235 } | 237 } |
244 } | 246 } |
245 }); | 247 }); |
246 }); | 248 }); |
247 } | 249 } |
248 | 250 |
249 private void serializeString (T) (T value, string key) | 251 private void serializeString (T) (T value, string key, Id id) |
250 { | 252 { |
251 auto id = nextId; | |
252 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof); | 253 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof); |
253 | 254 |
254 archive.archive(value, key, id); | 255 archive.archive(value, key, id); |
255 addSerializedArray(array, id); | 256 addSerializedArray(array, id); |
256 } | 257 } |
257 | 258 |
258 private void serializeArray (T) (T value, string key) | 259 private void serializeArray (T) (T value, string key, Id id) |
259 { | 260 { |
260 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof); | 261 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof); |
261 auto id = nextId; | |
262 | 262 |
263 archive.archiveArray(array, arrayToString!(T), key, id, { | 263 archive.archiveArray(array, arrayToString!(T), key, id, { |
264 foreach (i, e ; value) | 264 foreach (i, e ; value) |
265 serializeInternal(e, toData(i)); | 265 serializeInternal(e, toData(i)); |
266 }); | 266 }); |
267 | 267 |
268 addSerializedArray(array, id); | 268 addSerializedArray(array, id); |
269 } | 269 } |
270 | 270 |
271 private void serializeAssociativeArray (T) (T value, string key) | 271 private void serializeAssociativeArray (T) (T value, string key, Id id) |
272 { | 272 { |
273 auto reference = getSerializedReference(value); | 273 auto reference = getSerializedReference(value); |
274 | 274 |
275 if (reference != Id.max) | 275 if (reference != Id.max) |
276 return archive.archiveReference(key, reference); | 276 return archive.archiveReference(key, reference); |
277 | 277 |
278 Id id = nextId; | |
279 addSerializedReference(value, id); | 278 addSerializedReference(value, id); |
280 | 279 |
281 string keyType = KeyTypeOfAssociativeArray!(T).stringof; | 280 string keyType = KeyTypeOfAssociativeArray!(T).stringof; |
282 string valueType = ValueTypeOfAssociativeArray!(T).stringof; | 281 string valueType = ValueTypeOfAssociativeArray!(T).stringof; |
283 | 282 |
297 i++; | 296 i++; |
298 } | 297 } |
299 }); | 298 }); |
300 } | 299 } |
301 | 300 |
302 private void serializePointer (T) (T value, string key) | 301 private void serializePointer (T) (T value, string key, Id id) |
303 { | 302 { |
304 if (!value) | 303 if (!value) |
305 return archive.archiveNull(T.stringof, key); | 304 return archive.archiveNull(T.stringof, key); |
306 | |
307 Id id = nextId; | |
308 | 305 |
309 archive.archivePointer(key, id, { | 306 archive.archivePointer(key, id, { |
310 if (key in serializers) | 307 if (key in serializers) |
311 { | 308 { |
312 auto wrapper = getSerializerWrapper!(T)(key); | 309 auto wrapper = getSerializerWrapper!(T)(key); |
327 }); | 324 }); |
328 | 325 |
329 addSerializedPointer(value, id); | 326 addSerializedPointer(value, id); |
330 } | 327 } |
331 | 328 |
332 private void serializeEnum (T) (T value, string key) | 329 private void serializeEnum (T) (T value, string key, Id id) |
333 { | 330 { |
334 alias BaseTypeOfEnum!(T) EnumBaseType; | 331 alias BaseTypeOfEnum!(T) EnumBaseType; |
335 auto val = cast(EnumBaseType) value; | 332 auto val = cast(EnumBaseType) value; |
336 string type = T.stringof; | 333 string type = T.stringof; |
337 | 334 |
338 archive.archiveEnum(val, type, key, nextId); | 335 archive.archiveEnum(val, type, key, id); |
339 } | 336 } |
340 | 337 |
341 private void serializePrimitive (T) (T value, string key) | 338 private void serializePrimitive (T) (T value, string key, Id id) |
342 { | 339 { |
343 archive.archive(value, key, nextId); | 340 archive.archive(value, key, id); |
344 } | 341 } |
345 | 342 |
346 private void serializeTypedef (T) (T value, string key) | 343 private void serializeTypedef (T) (T value, string key, Id id) |
347 { | 344 { |
348 archive.archiveTypedef(T.stringof, key, nextId, { | 345 archive.archiveTypedef(T.stringof, key, nextId, { |
349 serializeInternal!(BaseTypeOfTypedef!(T))(value, nextKey); | 346 serializeInternal!(BaseTypeOfTypedef!(T))(value, id); |
350 }); | 347 }); |
351 } | 348 } |
352 | 349 |
353 T deserialize (T) (Data data, string key = null) | 350 T deserialize (T) (Data data, string key = null) |
354 { | 351 { |
663 const field = nameOfFieldAt!(T, i); | 660 const field = nameOfFieldAt!(T, i); |
664 | 661 |
665 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field)) | 662 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field)) |
666 { | 663 { |
667 alias typeof(T.tupleof[i]) Type; | 664 alias typeof(T.tupleof[i]) Type; |
668 Type v = value.tupleof[i]; | 665 Type v = value.tupleof[i]; |
669 | 666 auto id = nextId; |
670 addSerializedValue(value.tupleof[i], nextId); | 667 |
671 serializeInternal(v, toData(field)); | 668 addSerializedValue(value.tupleof[i], id); |
672 } | 669 serializeInternal(v, toData(field), id); |
670 } | |
673 } | 671 } |
674 | 672 |
675 static if (isObject!(T) && !is(T == Object)) | 673 static if (isObject!(T) && !is(T == Object)) |
676 serializeBaseTypes(value); | 674 serializeBaseTypes(value); |
677 } | 675 } |