diff --git a/f8/utils.h b/f8/utils.h index 6d03d4f..23c1c2b 100644 --- a/f8/utils.h +++ b/f8/utils.h @@ -33,43 +33,45 @@ namespace f8 abort(); } void* p = (char*)obj + field.offset; - switch (field.type) { - case a8::reflect::ET_INT32: - { - *((int*)p) = reader.GetValue(field.field_name); - } - break; - case a8::reflect::ET_UINT32: - { - *((unsigned int*)p) = reader.GetValue(field.field_name); - } - break; - case a8::reflect::ET_INT64: - { - *((long long*)p) = reader.GetValue(field.field_name); - } - break; - case a8::reflect::ET_FLOAT: - { - *((float*)p) = reader.GetValue(field.field_name).GetDouble(); - } - break; - case a8::reflect::ET_DOUBLE: - { - *((double*)p) = reader.GetValue(field.field_name); - } - break; - case a8::reflect::ET_STRING: - { - *((std::string*)p) = reader.GetValue(field.field_name).GetString(); - } - break; - default: - { - abort(); + if (reader.KeyExists(field.field_name)) { + switch (field.type) { + case a8::reflect::ET_INT32: + { + *((int*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_UINT32: + { + *((unsigned int*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_INT64: + { + *((long long*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_FLOAT: + { + *((float*)p) = reader.GetValue(field.field_name).GetDouble(); + } + break; + case a8::reflect::ET_DOUBLE: + { + *((double*)p) = reader.GetValue(field.field_name); + } + break; + case a8::reflect::ET_STRING: + { + *((std::string*)p) = reader.GetValue(field.field_name).GetString(); + } + break; + default: + { + abort(); + } } + obj->__flags__.set(i); } - obj->__flags__.set(i); } meta_list.push_back(obj); }