comparison orange/serialization/Serializer.d @ 2:ea37a9470e3e

Fixed multiple NonSerialized
author Jacob Carlborg <doob@me.com>
date Mon, 31 May 2010 17:44:23 +0200
parents f7b078e85f7f
children 3c155e4c3d56
comparison
equal deleted inserted replaced
1:11a31bd929f9 2:ea37a9470e3e
113 serializePrimitive(value, key); 113 serializePrimitive(value, key);
114 114
115 else static if (isPointer!(T)) 115 else static if (isPointer!(T))
116 { 116 {
117 static if (isFunctionPointer!(T)) 117 static if (isFunctionPointer!(T))
118 static assert(false, format!(`The type "`, T, `" cannot be serialized.`)); 118 goto error;
119 119
120 else 120 else
121 serializePointer(value, key); 121 serializePointer(value, key);
122 } 122 }
123
124 123
125 else static if (isEnum!(T)) 124 else static if (isEnum!(T))
126 serializeEnum(value, key); 125 serializeEnum(value, key);
127 126
128 else 127 else
129 static assert(false, format!(`The type "`, T, `" cannot be serialized.`)); 128 {
129 error:
130 throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__);
131 }
130 132
131 return archive.data; 133 return archive.data;
132 } 134 }
133 135
134 private void serializeObject (T) (T value, DataType key) 136 private void serializeObject (T) (T value, DataType key)
135 { 137 {
136 auto nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
137
138 triggerEvents(serializing, value, { 138 triggerEvents(serializing, value, {
139 archive.archive(value, key, { 139 archive.archive(value, key, {
140 auto runtimeType = value.classinfo.name; 140 auto runtimeType = value.classinfo.name;
141 141
142 if (runtimeType in serializers) 142 if (runtimeType in serializers)
151 else 151 else
152 { 152 {
153 if (isBaseClass(value)) 153 if (isBaseClass(value))
154 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__); 154 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__);
155 155
156 objectStructSerializeHelper(value, nonSerializedFields); 156 objectStructSerializeHelper(value);
157 } 157 }
158 }); 158 });
159 }); 159 });
160 } 160 }
161 161
162 private void serializeStruct (T) (T value, DataType key) 162 private void serializeStruct (T) (T value, DataType key)
163 { 163 {
164 auto nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
165
166 triggerEvents(serializing, value, { 164 triggerEvents(serializing, value, {
167 archive.archive(value, key, { 165 archive.archive(value, key, {
168 auto type = toDataType(T.stringof); 166 auto type = toDataType(T.stringof);
169 167
170 if (type in serializers) 168 if (type in serializers)
177 { 175 {
178 static if (isSerializable!(T, ArchiveType)) 176 static if (isSerializable!(T, ArchiveType))
179 value.toData(this, key); 177 value.toData(this, key);
180 178
181 else 179 else
182 objectStructSerializeHelper(value, nonSerializedFields); 180 objectStructSerializeHelper(value);
183 } 181 }
184 }); 182 });
185 }); 183 });
186 } 184 }
187 185
283 281
284 else static if (isPrimitive!(T)) 282 else static if (isPrimitive!(T))
285 return deserializePrimitive!(T)(key); 283 return deserializePrimitive!(T)(key);
286 284
287 else static if (isPointer!(T)) 285 else static if (isPointer!(T))
286 {
287 static if (isFunctionPointer!(T))
288 goto error;
289
288 return deserializePointer!(T)(key); 290 return deserializePointer!(T)(key);
291 }
289 292
290 else static if (isEnum!(T)) 293 else static if (isEnum!(T))
291 return deserializeEnum!(T)(key); 294 return deserializeEnum!(T)(key);
292 295
293 else 296 else
294 static assert(false, format!(`The type "`, T, `" cannot be deserialized.`)); 297 {
298 error:
299 throw new SerializationException(format!(`The type "`, T, `" cannot be deserialized.`), __FILE__, __LINE__);
300 }
295 } 301 }
296 302
297 private T deserializeObject (T) (DataType key) 303 private T deserializeObject (T) (DataType key)
298 { 304 {
299 T value = archive.unarchive!(T)(key, (T value) { 305 T value = archive.unarchive!(T)(key, (T value) {
300 auto nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
301
302 triggerEvents(deserializing, value, { 306 triggerEvents(deserializing, value, {
303 auto runtimeType = value.classinfo.name; 307 auto runtimeType = value.classinfo.name;
304 308
305 if (runtimeType in deserializers) 309 if (runtimeType in deserializers)
306 { 310 {
314 else 318 else
315 { 319 {
316 if (isBaseClass(value)) 320 if (isBaseClass(value))
317 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__); 321 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__);
318 322
319 objectStructDeserializeHelper(value, nonSerializedFields); 323 objectStructDeserializeHelper(value);
320 } 324 }
321 }); 325 });
322 326
323 return value; 327 return value;
324 }); 328 });
327 } 331 }
328 332
329 private T deserializeStruct (T) (DataType key) 333 private T deserializeStruct (T) (DataType key)
330 { 334 {
331 return archive.unarchive!(T)(key, (T value) { 335 return archive.unarchive!(T)(key, (T value) {
332 auto nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
333
334 triggerEvents(deserializing, value, { 336 triggerEvents(deserializing, value, {
335 auto type = toDataType(T.stringof); 337 auto type = toDataType(T.stringof);
336 338
337 if (type in deserializers) 339 if (type in deserializers)
338 { 340 {
344 { 346 {
345 static if (isSerializable!(T, ArchiveType)) 347 static if (isSerializable!(T, ArchiveType))
346 value.fromData(this, key); 348 value.fromData(this, key);
347 349
348 else 350 else
349 objectStructDeserializeHelper(value, nonSerializedFields); 351 objectStructDeserializeHelper(value);
350 } 352 }
351 }); 353 });
352 354
353 return value; 355 return value;
354 }); 356 });
419 return archive.unarchive!(T)(key, (T value) { 421 return archive.unarchive!(T)(key, (T value) {
420 return deserializeInternal!(BaseTypeOfTypeDef!(T))(key); 422 return deserializeInternal!(BaseTypeOfTypeDef!(T))(key);
421 }); 423 });
422 } 424 }
423 425
424 private void objectStructSerializeHelper (T) (T value, string[] nonSerializedFields) 426 private void objectStructSerializeHelper (T) (T value)
425 { 427 {
428 const nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
429
426 foreach (i, dummy ; typeof(T.tupleof)) 430 foreach (i, dummy ; typeof(T.tupleof))
427 { 431 {
428 const field = nameOfFieldAt!(T, i); 432 const field = nameOfFieldAt!(T, i);
429 433
430 if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field)) 434 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
431 { 435 {
432 alias typeof(T.tupleof[i]) Type; 436 alias typeof(T.tupleof[i]) Type;
433
434 Type v = value.tupleof[i]; 437 Type v = value.tupleof[i];
435
436 //Type v = getValueOfField!(T, Type, field)(value);
437 serialize(v, toDataType(field)); 438 serialize(v, toDataType(field));
438 } 439 }
439 } 440 }
440 441
441 static if (is(T : Object) && !is(T == Object)) 442 static if (is(T : Object) && !is(T == Object))
442 serializeBaseTypes(value, nonSerializedFields); 443 serializeBaseTypes(value);
443 } 444 }
444 445
445 private void objectStructDeserializeHelper (T) (T value, string[] nonSerializedFields) 446 private void objectStructDeserializeHelper (T) (T value)
446 { 447 {
448 const nonSerializedFields = collectAnnotations!(nonSerializedField)(value);
449
447 foreach (i, dummy ; typeof(T.tupleof)) 450 foreach (i, dummy ; typeof(T.tupleof))
448 { 451 {
449 const field = nameOfFieldAt!(T, i); 452 const field = nameOfFieldAt!(T, i);
450 453
451 if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field)) 454 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
452 { 455 {
453 alias TypeOfField!(T, field) Type; 456 alias TypeOfField!(T, field) Type;
454 auto fieldValue = deserializeInternal!(Type)(toDataType(field)); 457 auto fieldValue = deserializeInternal!(Type)(toDataType(field));
455 setValueOfField!(T, Type, field)(value, fieldValue); 458 value.tupleof[i] = fieldValue;
456 } 459 }
457 } 460 }
458 461
459 static if (is(T : Object) && !is(T == Object)) 462 static if (is(T : Object) && !is(T == Object))
460 deserializeBaseTypes(value, nonSerializedFields); 463 deserializeBaseTypes(value);
461 } 464 }
462 465
463 private void serializeBaseTypes (T : Object) (T value, string[] nonSerializedFields) 466 private void serializeBaseTypes (T : Object) (T value)
464 { 467 {
465 alias BaseTypeTupleOf!(T)[0] Base; 468 alias BaseTypeTupleOf!(T)[0] Base;
466 469
467 static if (!is(Base == Object)) 470 static if (!is(Base == Object))
468 { 471 {
469 archive.archiveBaseClass!(Base)(nextKey); 472 archive.archiveBaseClass!(Base)(nextKey);
470 objectStructSerializeHelper!(Base)(value, nonSerializedFields); 473 objectStructSerializeHelper!(Base)(value);
471 } 474 }
472 } 475 }
473 476
474 private void deserializeBaseTypes (T : Object) (T value, string[] nonSerializedFields) 477 private void deserializeBaseTypes (T : Object) (T value)
475 { 478 {
476 alias BaseTypeTupleOf!(T)[0] Base; 479 alias BaseTypeTupleOf!(T)[0] Base;
477 480
478 static if (!is(Base == Object)) 481 static if (!is(Base == Object))
479 { 482 {
480 archive.unarchiveBaseClass!(Base)(nextKey); 483 archive.unarchiveBaseClass!(Base)(nextKey);
481 objectStructDeserializeHelper!(Base)(value, nonSerializedFields); 484 objectStructDeserializeHelper!(Base)(value);
482 } 485 }
483 } 486 }
484 487
485 private SerializeRegisterWrapper!(T, ArchiveType) getSerializerWrapper (T) (string type) 488 private SerializeRegisterWrapper!(T, ArchiveType) getSerializerWrapper (T) (string type)
486 { 489 {
581 584
582 else 585 else
583 triggerEvent!(onDeserializedField)(value); 586 triggerEvent!(onDeserializedField)(value);
584 } 587 }
585 588
586 private string[] collectAnnotations (string name, T) (T value) 589 private static string[] collectAnnotations (string name, T) (T value)
587 { 590 {
588 static assert (is(T == class) || is(T == struct), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are classes and structs.`)); 591 static assert (is(T == class) || is(T == struct), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are classes and structs.`));
589 592
590 string[] annotations; 593 string[] annotations;
591 594
593 { 596 {
594 const field = nameOfFieldAt!(T, i); 597 const field = nameOfFieldAt!(T, i);
595 598
596 static if (field == name) 599 static if (field == name)
597 { 600 {
598 alias TypeOfField!(T, field) Type; 601 typeof(value.tupleof[i]) f;
599 auto f = getValueOfField!(T, Type, field)(value);
600 annotations ~= f.field; 602 annotations ~= f.field;
601 } 603 }
602 } 604 }
603 605
604 return annotations; 606 return annotations;