using ExtremeEngineEditor;
namespace ExtremeEngine.Serialization
public static class SerializedObjectFormatter
public static void Serialize(ref Utf8JsonWriter writer, SerializedObject? value)
writer.WriteStartObject();
var allProperties = value.GetAllProperties();
int propertiesSize = allProperties.Count();
for (int i = 0; i < propertiesSize; i++)
var property = allProperties.ElementAt(i);
if (property != null && property.Value != null)
writer.WritePropertyName(property.Info.Name);
var typeCode = Convert.GetTypeCode(property.Value);
if (typeCode != TypeCode.Object)
writer.WriteStringValue((string)property.Value);
writer.WriteStringValue((DateTime)property.Value);
writer.WriteNumberValue((decimal)property.Value);
writer.WriteNumberValue((double)property.Value);
writer.WriteNumberValue((float)property.Value);
writer.WriteNumberValue((Int16)property.Value);
writer.WriteNumberValue((Int32)property.Value);
writer.WriteNumberValue((Int64)property.Value);
writer.WriteNumberValue((UInt16)property.Value);
writer.WriteNumberValue((UInt32)property.Value);
writer.WriteNumberValue((UInt64)property.Value);
writer.WriteBooleanValue((bool)property.Value);
Debug.LogError("Cannot serialize property: " + property.Info.Name + " of TypeCode: " + typeCode);
else if (property.Value.GetType().IsAssignableFrom(typeof(Object)))
writer.WriteStringValue((property.Value as Object).GUID);
else if (property.Value.GetType().IsAssignableFrom(typeof(Vector2)))
writer.WriteStringValue(((Vector2)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Vector3)))
writer.WriteStringValue(((Vector3)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Vector4)))
writer.WriteStringValue(((Vector4)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Color255)))
writer.WriteStringValue(((Color255)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(ColorHSV)))
writer.WriteStringValue(((ColorHSV)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Color)))
writer.WriteStringValue(((Color)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Rect)))
writer.WriteStringValue(((Rect)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Quaternion)))
writer.WriteStringValue(((Quaternion)property.Value).ToString());
else if (property.Value.GetType().IsAssignableFrom(typeof(Mat4)))
writer.WriteStringValue(((Mat4)property.Value).ToString());
if (value.TargetObject.GetType() == typeof(EntityObject))
writer.WriteStartArray("Entity components");
var allComponents = ((EntityObject)value.TargetObject).GetAllComponents();
for (int c = 0; c < allComponents.Count; c++)
var serializedObject = new SerializedObject(allComponents[c]);
writer.WriteStartObject();
writer.WritePropertyName("Component type");
writer.WriteStringValue(serializedObject.TargetObject.GetType().FullName);
writer.WriteStartArray("Component data");
SerializedObjectFormatter.Serialize(ref writer, new SerializedObject(allComponents[c]));
public static T? Deserialize<T>(ref Utf8JsonReader reader) where T : Object => (T?)Deserialize(ref reader, typeof(T));
public static Object? Deserialize(ref Utf8JsonReader reader, Type type)
Debug.LogError("Cannot deserialize type because is null!");
var instance = Activator.CreateInstance(type);
Debug.LogError("Cannot deserialize failed to create instance of type maybe the used type is null!");
if (reader.TokenType == JsonTokenType.StartObject)
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
if (reader.TokenType == JsonTokenType.PropertyName)
string? propertyName = reader.GetString();
var allProperties = SerializedObject.GetFieldsThatCanBeSerialized(type);
for (int i = 0; i < allProperties.Count; i++)
if (propertyName == allProperties[i].Name)
var field = instance.GetType().GetField(propertyName);
var typeCode = Convert.GetTypeCode(field.FieldType);
if (!field.FieldType.IsAssignableFrom(typeof(Object)))
switch (reader.TokenType)
field.SetValue(instance, true);
case JsonTokenType.False:
field.SetValue(instance, false);
var strValue = reader.GetString();
if (strValue != null | strValue == null && field.FieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
field.SetValue(instance, reader.GetString());
case (TypeCode.DateTime):
var dateTimeValue = reader.GetDateTime();
if (dateTimeValue != null | dateTimeValue == null && field.FieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
field.SetValue(instance, reader.GetDateTime());
field.SetValue(instance, reader.GetSingle());
field.SetValue(instance, reader.GetDouble());
field.SetValue(instance, reader.GetDecimal());
field.SetValue(instance, reader.GetInt16());
field.SetValue(instance, reader.GetInt32());
field.SetValue(instance, reader.GetInt64());
field.SetValue(instance, reader.GetBoolean());
field.SetValue(instance, null);
Debug.LogError("Cannot deserialize Object property: " + propertyName + " with tokenType: " + reader.TokenType + " with typeCode: " + typeCode);
else if (field.FieldType.IsAssignableFrom(typeof(Object)))
switch (reader.TokenType)
case (JsonTokenType.String):
Debug.LogError("Cannot deserialize Object property: " + propertyName + " with tokenType: " + reader.TokenType);
Debug.LogError("Cannot deserialize Object property: " + propertyName + " with tokenType: " + reader.TokenType);
Debug.LogError("Cannot deserialize Object property: " + propertyName + " with tokenType: " + reader.TokenType + " with typeCode: " + typeCode);
Debug.LogError("Field with name: " + propertyName + " not found!");
return instance as Object;