From 316837dfdf9c42aac42b0e4653f1efc46c023f5b Mon Sep 17 00:00:00 2001 From: VaDiM Date: Sat, 2 Nov 2024 01:59:43 +0300 Subject: [PATCH] Fix parsing via typetree of old Material assets - Fixed parsing via typetree of Material assets from Unity version <5.6 --- AssetStudio/AssetsManager.cs | 2 +- .../JsonConverterHelpers/KVPConverter.cs | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 AssetStudio/JsonConverterHelpers/KVPConverter.cs diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 2bc7c34..85b0e57 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -515,7 +515,7 @@ namespace AssetStudio var jsonOptions = new JsonSerializerOptions { - Converters = { new JsonConverterHelper.ByteArrayConverter(), new JsonConverterHelper.PPtrConverter() }, + Converters = { new JsonConverterHelper.ByteArrayConverter(), new JsonConverterHelper.PPtrConverter(), new JsonConverterHelper.KVPConverter() }, NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals, PropertyNameCaseInsensitive = true, IncludeFields = true, diff --git a/AssetStudio/JsonConverterHelpers/KVPConverter.cs b/AssetStudio/JsonConverterHelpers/KVPConverter.cs new file mode 100644 index 0000000..120e2c0 --- /dev/null +++ b/AssetStudio/JsonConverterHelpers/KVPConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AssetStudio +{ + public static partial class JsonConverterHelper + { + public class KVPConverter : JsonConverterFactory + { + public override bool CanConvert(Type typeToConvert) + { + if (!typeToConvert.IsGenericType) + return false; + + var generic = typeToConvert.GetGenericTypeDefinition(); + return generic == typeof(KeyValuePair<,>); + } + + public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) + { + var kvpArgs = type.GetGenericArguments(); + return (JsonConverter)Activator.CreateInstance(typeof(KVPConverter<,>).MakeGenericType(kvpArgs)); + } + } + + private class KVPConverter : JsonConverter> + { + public override KeyValuePair Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + //startKvpObject + reader.Read(); //propName + reader.Read(); //keyType + var key = reader.TokenType == JsonTokenType.StartObject + ? JsonSerializer.Deserialize>(ref reader).Values.First() + : JsonSerializer.Deserialize(ref reader); + reader.Read(); //propName + reader.Read(); //startObject + var value = JsonSerializer.Deserialize(ref reader, options); + reader.Read(); //endKvpObject + + return new KeyValuePair(key, value); + } + + public override void Write(Utf8JsonWriter writer, KeyValuePair value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } + } + } +}