Fixed primitive fields not being serialised

This commit is contained in:
Kah Wei 2022-10-20 10:10:43 +08:00
parent cfed342f9c
commit 4bc91283c8
2 changed files with 45 additions and 44 deletions

View File

@ -73,7 +73,7 @@ namespace SHADE
// Create YAML object // Create YAML object
YAML::Node scriptNode; YAML::Node scriptNode;
scriptNode.SetStyle(YAML::EmitterStyle::Block); scriptNode.SetStyle(YAML::EmitterStyle::Block);
scriptNode[SCRIPT_TYPE_YAMLTAG] = Convert::ToNative(object->GetType()->FullName); scriptNode[SCRIPT_TYPE_YAMLTAG.data()] = Convert::ToNative(object->GetType()->FullName);
// Get all fields // Get all fields
System::Collections::Generic::IEnumerable<FieldInfo^>^ fields = GetInstanceFields(object); System::Collections::Generic::IEnumerable<FieldInfo^>^ fields = GetInstanceFields(object);
@ -129,51 +129,53 @@ namespace SHADE
YAML::Node fieldNode; YAML::Node fieldNode;
// Retrieve string for the YAML // Retrieve string for the YAML
if (fieldInsertYaml<System::Int16> (fieldInfo, object, fieldNode) || const bool PRIMITIVE_SERIALIZED = fieldInsertYaml<System::Int16>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::Int32> (fieldInfo, object, fieldNode) || fieldInsertYaml<System::Int32>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::Int64> (fieldInfo, object, fieldNode) || fieldInsertYaml<System::Int64>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::UInt16>(fieldInfo, object, fieldNode) || fieldInsertYaml<System::UInt16>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::UInt32>(fieldInfo, object, fieldNode) || fieldInsertYaml<System::UInt32>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::UInt64>(fieldInfo, object, fieldNode) || fieldInsertYaml<System::UInt64>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<System::Byte> (fieldInfo, object, fieldNode) || fieldInsertYaml<System::Byte>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<bool> (fieldInfo, object, fieldNode) || fieldInsertYaml<bool>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<float> (fieldInfo, object, fieldNode) || fieldInsertYaml<float>(fieldInfo, object, fieldNode) ||
fieldInsertYaml<double> (fieldInfo, object, fieldNode)) fieldInsertYaml<double>(fieldInfo, object, fieldNode);
// Serialization of more complex types
if (!PRIMITIVE_SERIALIZED)
{ {
return; if (fieldInfo->FieldType->IsSubclassOf(System::Enum::typeid))
} {
else if (fieldInfo->FieldType->IsSubclassOf(System::Enum::typeid)) fieldNode = std::to_string(safe_cast<int>(fieldInfo->GetValue(object)));
{ }
fieldNode = std::to_string(safe_cast<int>(fieldInfo->GetValue(object))); else if (fieldInfo->FieldType == System::String::typeid)
} {
else if (fieldInfo->FieldType == System::String::typeid) System::String^ str = safe_cast<System::String^>(fieldInfo->GetValue(object));
{ fieldNode = Convert::ToNative(str);
System::String^ str = safe_cast<System::String^>(fieldInfo->GetValue(object)); }
fieldNode = Convert::ToNative(str); else if (fieldInfo->FieldType == Vector2::typeid)
} {
else if (fieldInfo->FieldType == Vector2::typeid) Vector2 vec = safe_cast<Vector2>(fieldInfo->GetValue(object));
{ fieldNode.SetStyle(YAML::EmitterStyle::Flow);
Vector2 vec = safe_cast<Vector2>(fieldInfo->GetValue(object)); fieldNode.push_back(vec.x);
fieldNode.SetStyle(YAML::EmitterStyle::Flow); fieldNode.push_back(vec.y);
fieldNode.push_back(vec.x); }
fieldNode.push_back(vec.y); else if (fieldInfo->FieldType == Vector3::typeid)
} {
else if (fieldInfo->FieldType == Vector3::typeid) Vector3 vec = safe_cast<Vector3>(fieldInfo->GetValue(object));
{ fieldNode.SetStyle(YAML::EmitterStyle::Flow);
Vector3 vec = safe_cast<Vector3>(fieldInfo->GetValue(object)); fieldNode.push_back(vec.x);
fieldNode.SetStyle(YAML::EmitterStyle::Flow); fieldNode.push_back(vec.y);
fieldNode.push_back(vec.x); fieldNode.push_back(vec.z);
fieldNode.push_back(vec.y); }
fieldNode.push_back(vec.z); else // Not any of the supported types
} {
else // Not any of the supported types Debug::LogWarning(Convert::ToNative(System::String::Format
{ (
Debug::LogWarning(Convert::ToNative(System::String::Format "[ReflectionUtilities] Failed to parse \"{0}\" of \"{1}\" type for serialization.",
( fieldInfo->Name, fieldInfo->FieldType)
"[ReflectionUtilities] Failed to parse \"{0}\" of \"{1}\" type for serialization.", ));
fieldInfo->Name, fieldInfo->FieldType) return;
)); }
return;
} }
// Store the field into YAML // Store the field into YAML

View File

@ -58,8 +58,7 @@ namespace SHADE
/// deserialised data into the specified object if there are matching fields. /// deserialised data into the specified object if there are matching fields.
/// </summary> /// </summary>
/// <param name="yamlNode"> /// <param name="yamlNode">
/// The JSON string that contains the data to copy into this PlushieScript /// The JSON string that contains the data to copy into this Script object.
/// object.
/// </param> /// </param>
/// <param name="object">The object to copy deserialised data into.</param> /// <param name="object">The object to copy deserialised data into.</param>
static void Deserialise(System::Object^ object, YAML::Node& yamlNode); static void Deserialise(System::Object^ object, YAML::Node& yamlNode);