Refactor serialziation of ControlReference into a string with ID of actor for simplicity

#3123
This commit is contained in:
Wojtek Figat
2025-03-04 17:14:21 +01:00
parent 35fa63852c
commit 520bab7463
3 changed files with 194 additions and 66 deletions

View File

@@ -442,7 +442,7 @@ namespace FlaxEngine.Json
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
var result = Activator.CreateInstance(objectType);
var result = existingValue ?? Activator.CreateInstance(objectType);
if (reader.TokenType == JsonToken.String)
{
JsonSerializer.ParseID((string)reader.Value, out var id);
@@ -483,6 +483,34 @@ namespace FlaxEngine.Json
}
}
internal class ControlReferenceConverter : JsonConverter
{
/// <inheritdoc />
public override unsafe void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
var id = (value as IControlReference)?.UIControl?.ID ?? Guid.Empty;
writer.WriteValue(JsonSerializer.GetStringID(&id));
}
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
var result = existingValue ?? Activator.CreateInstance(objectType);
if (reader.TokenType == JsonToken.String && result is IControlReference controlReference)
{
JsonSerializer.ParseID((string)reader.Value, out var id);
controlReference.UIControl = Object.Find<UIControl>(ref id);
}
return result;
}
/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return objectType.Name.StartsWith("ControlReference", StringComparison.Ordinal);
}
}
/*
/// <summary>
/// Serialize Guid values using `N` format

View File

@@ -194,6 +194,7 @@ namespace FlaxEngine.Json
settings.Converters.Add(new SoftObjectReferenceConverter());
settings.Converters.Add(new SoftTypeReferenceConverter());
settings.Converters.Add(new BehaviorKnowledgeSelectorAnyConverter());
settings.Converters.Add(new ControlReferenceConverter());
settings.Converters.Add(new MarginConverter());
settings.Converters.Add(new VersionConverter());
settings.Converters.Add(new LocalizedStringConverter());