Fix incorrect JsonAssetReference<T> serialization

#2774
This commit is contained in:
Wojtek Figat
2024-07-26 01:13:52 +02:00
parent 9f078a6e3c
commit 7a89e78f43
2 changed files with 55 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ namespace FlaxEngine
#if FLAX_EDITOR
[CustomEditor(typeof(FlaxEditor.CustomEditors.Editors.AssetRefEditor))]
#endif
[Newtonsoft.Json.JsonConverter(typeof(Json.JsonAssetReferenceConverter))]
public struct JsonAssetReference<T> : IComparable, IComparable<JsonAssetReference<T>>, IEquatable<JsonAssetReference<T>>
{
/// <summary>

View File

@@ -429,6 +429,60 @@ namespace FlaxEngine.Json
}
}
internal sealed class JsonAssetReferenceConverter : JsonConverter
{
/// <inheritdoc />
public override unsafe void WriteJson(JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
var asset = (JsonAsset)value.GetType().GetField("Asset").GetValue(value);
var id = asset?.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 = Activator.CreateInstance(objectType);
if (reader.TokenType == JsonToken.String)
{
JsonSerializer.ParseID((string)reader.Value, out var id);
var asset = Content.LoadAsync<JsonAsset>(id);
objectType.GetField("Asset").SetValue(result, asset);
}
else if (reader.TokenType == JsonToken.StartObject)
{
// [Deprecated on 26.07.2024, expires on 26.07.2026]
while (reader.Read() && reader.TokenType != JsonToken.EndObject)
{
switch (reader.TokenType)
{
case JsonToken.PropertyName:
{
var propertyName = (string)reader.Value;
reader.Read();
if (propertyName == "Asset" && reader.TokenType == JsonToken.String)
{
JsonSerializer.ParseID((string)reader.Value, out var id);
var asset = Content.LoadAsync<JsonAsset>(id);
objectType.GetField("Asset").SetValue(result, asset);
}
break;
}
}
}
}
return result;
}
/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return objectType.Name.StartsWith("JsonAssetReference");
}
}
/*
/// <summary>
/// Serialize Guid values using `N` format