comparison orange/serialization/Serializable.d @ 39:301476d40518

Made a couple of refactorings: * Removed Serializable * Added a Serializable interface * Moved isSerializable and updated the implementation * Added new deserialize methods for deserialize without data during deserializing
author Jacob Carlborg <doob@me.com>
date Thu, 04 Aug 2011 21:29:56 +0200
parents 511d1ef4e299
children
comparison
equal deleted inserted replaced
38:9443bcddc699 39:301476d40518
6 */ 6 */
7 module orange.serialization.Serializable; 7 module orange.serialization.Serializable;
8 8
9 import orange.serialization.archives.Archive; 9 import orange.serialization.archives.Archive;
10 import orange.serialization.Events; 10 import orange.serialization.Events;
11 import orange.serialization.Serializer;
11 import orange.util.CTFE; 12 import orange.util.CTFE;
12 13
13 template Serializable () 14 interface Serializable
14 { 15 {
15 void toData (T) (T archive, T.DataType key) 16 void toData (Serializer serializer, Serializer.Data key);
16 { 17 void fromData (Serializer serializer, Serializer.Data key);
17 alias typeof(this) ThisType; 18 }
18 19
19 foreach (i, dummy ; typeof(T.tupleof)) 20 template isSerializable (T)
20 { 21 {
21 alias typeof(ThisType.tupleof[i]) FieldType; 22 const isSerializable = is(T : Serializable) || (
22 23 is(typeof(T.toData(Serializer.init, Serializer.Data.init))) &&
23 const field = nameOfFieldAt!(ThisType, i); 24 is(typeof(T.fromData(Serializer.init, Serializer.Data.init))));
24 auto value = getValueOfField!(ThisType, FieldType, field)(this);
25
26 archive.archive(value, field);
27 }
28 }
29
30 void fromData (T) (T archive, T.DataType key)
31 {
32 alias typeof(this) ThisType;
33
34 foreach (i, dummy ; typeof(ThisType.tupleof))
35 {
36 alias typeof(ThisType.tupleof[i]) FieldType;
37
38 const field = nameOfFieldAt!(ThisType, i);
39 auto value = archive.unarchive!(FieldType)(field);
40
41 setValueOfField!(FieldType, ThisType, field)(this, value);
42 }
43 }
44 } 25 }
45 26
46 template NonSerialized (alias field) 27 template NonSerialized (alias field)
47 { 28 {
48 NonSerializedField!(field) __nonSerialized; 29 NonSerializedField!(field) __nonSerialized;