diff --git a/Engine.Integration/Engine.Integration.Yaml/Converters/SerializedClassConverter.cs b/Engine.Integration/Engine.Integration.Yaml/Converters/SerializedClassConverter.cs index aef2822..525de45 100644 --- a/Engine.Integration/Engine.Integration.Yaml/Converters/SerializedClassConverter.cs +++ b/Engine.Integration/Engine.Integration.Yaml/Converters/SerializedClassConverter.cs @@ -20,8 +20,8 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase publicDictionary = []; - Dictionary privateDictionary = []; + Dictionary publicDictionary = []; + Dictionary privateDictionary = []; parser.Consume(); @@ -32,16 +32,24 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase().Value; break; - case nameof(SerializedClass.Public): publicDictionary = (Dictionary)rootDeserializer(typeof(Dictionary))!; break; - case nameof(SerializedClass.Private): privateDictionary = (Dictionary)rootDeserializer(typeof(Dictionary))!; break; + case nameof(SerializedClass.Public): publicDictionary = (Dictionary)rootDeserializer(typeof(Dictionary))!; break; + case nameof(SerializedClass.Private): privateDictionary = (Dictionary)rootDeserializer(typeof(Dictionary))!; break; } } - foreach ((string key, TypeContainer typeContainer) in publicDictionary) - serializedClass.Public.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type))); + Type classType = TypeFactory.GetType(serializedClass.Type); - foreach ((string key, TypeContainer typeContainer) in privateDictionary) - serializedClass.Private.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type))); + foreach ((string key, object @object) in publicDictionary) + if (@object is TypeContainer typeContainer) + serializedClass.Public.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type))); + else + serializedClass.Public.Add(key, Serializer.InternalDeserialize(@object.ToString()!, (classType.GetProperty(key, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)?.PropertyType ?? classType.GetField(key, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)?.FieldType)!)); + + foreach ((string key, object @object) in privateDictionary) + if (@object is TypeContainer typeContainer) + serializedClass.Private.Add(key, Serializer.InternalDeserialize(typeContainer.Value!.ToString()!, TypeFactory.GetType(typeContainer.Type))); + else + serializedClass.Private.Add(key, Serializer.InternalDeserialize(@object.ToString()!, (classType.GetProperty(key, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Default)?.PropertyType ?? classType.GetField(key, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Default)?.FieldType)!)); ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Read {serializedClass.Type}"); return serializedClass; @@ -54,14 +62,20 @@ public class SerializedClassConverter : EngineTypeYamlSerializerBase publics = []; - Dictionary privates = []; + Dictionary publics = []; + Dictionary privates = []; foreach ((string key, object? @object) in serializedClass.Public.Where(v => !v.GetType().HasAttribute())) - publics.Add(key, new TypeContainer(@object)); + if (@object?.GetType().IsClass == false) + publics.Add(key, @object!); + else + publics.Add(key, new TypeContainer(@object)); foreach ((string key, object? @object) in serializedClass.Private.Where(v => !v.GetType().HasAttribute())) - privates.Add(key, new TypeContainer(@object)); + if (@object?.GetType().IsClass == false) + privates.Add(key, @object!); + else + privates.Add(key, new TypeContainer(@object)); emitter.Emit(new MappingStart());