diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2023-03-21 20:14:46 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-21 20:14:46 -0300 |
| commit | ba95ee54abf4905d38f3563881a1643f102993b3 (patch) | |
| tree | 4a17ec5f209e64e4944b7deceec5dbdf1e0d9dc3 /Ryujinx.Common | |
| parent | 4ce4299ca2a6b11332f2341c69f40efd7205282f (diff) | |
Revert "Use source generated json serializers in order to improve code trimming (#4094)" (#4576)
This reverts commit 4ce4299ca2a6b11332f2341c69f40efd7205282f.
Diffstat (limited to 'Ryujinx.Common')
28 files changed, 148 insertions, 355 deletions
diff --git a/Ryujinx.Common/Configuration/AspectRatioExtensions.cs b/Ryujinx.Common/Configuration/AspectRatioExtensions.cs index 5e97ed19..3d0be88e 100644 --- a/Ryujinx.Common/Configuration/AspectRatioExtensions.cs +++ b/Ryujinx.Common/Configuration/AspectRatioExtensions.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration +namespace Ryujinx.Common.Configuration { - [JsonConverter(typeof(TypedStringEnumConverter<AspectRatio>))] public enum AspectRatio { Fixed4x3, diff --git a/Ryujinx.Common/Configuration/BackendThreading.cs b/Ryujinx.Common/Configuration/BackendThreading.cs index 8833b3f0..cfc08914 100644 --- a/Ryujinx.Common/Configuration/BackendThreading.cs +++ b/Ryujinx.Common/Configuration/BackendThreading.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration +namespace Ryujinx.Common.Configuration { - [JsonConverter(typeof(TypedStringEnumConverter<BackendThreading>))] public enum BackendThreading { Auto, diff --git a/Ryujinx.Common/Configuration/DownloadableContentJsonSerializerContext.cs b/Ryujinx.Common/Configuration/DownloadableContentJsonSerializerContext.cs deleted file mode 100644 index 132c45a4..00000000 --- a/Ryujinx.Common/Configuration/DownloadableContentJsonSerializerContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration -{ - [JsonSourceGenerationOptions(WriteIndented = true)] - [JsonSerializable(typeof(List<DownloadableContentContainer>))] - public partial class DownloadableContentJsonSerializerContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Configuration/GraphicsBackend.cs b/Ryujinx.Common/Configuration/GraphicsBackend.cs index d74dd6e1..26e4a28a 100644 --- a/Ryujinx.Common/Configuration/GraphicsBackend.cs +++ b/Ryujinx.Common/Configuration/GraphicsBackend.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration +namespace Ryujinx.Common.Configuration { - [JsonConverter(typeof(TypedStringEnumConverter<GraphicsBackend>))] public enum GraphicsBackend { Vulkan, diff --git a/Ryujinx.Common/Configuration/GraphicsDebugLevel.cs b/Ryujinx.Common/Configuration/GraphicsDebugLevel.cs index ad12302a..556af689 100644 --- a/Ryujinx.Common/Configuration/GraphicsDebugLevel.cs +++ b/Ryujinx.Common/Configuration/GraphicsDebugLevel.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - namespace Ryujinx.Common.Configuration { - [JsonConverter(typeof(TypedStringEnumConverter<GraphicsDebugLevel>))] public enum GraphicsDebugLevel { None, diff --git a/Ryujinx.Common/Configuration/Hid/Controller/Motion/JsonMotionConfigControllerConverter.cs b/Ryujinx.Common/Configuration/Hid/Controller/Motion/JsonMotionConfigControllerConverter.cs index 2b9e0af4..d1c2e4e8 100644 --- a/Ryujinx.Common/Configuration/Hid/Controller/Motion/JsonMotionConfigControllerConverter.cs +++ b/Ryujinx.Common/Configuration/Hid/Controller/Motion/JsonMotionConfigControllerConverter.cs @@ -1,5 +1,4 @@ -using Ryujinx.Common.Utilities; -using System; +using System; using System.Text.Json; using System.Text.Json.Serialization; @@ -7,8 +6,6 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion { class JsonMotionConfigControllerConverter : JsonConverter<MotionConfigController> { - private static readonly MotionConfigJsonSerializerContext SerializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - private static MotionInputBackendType GetMotionInputBackendType(ref Utf8JsonReader reader) { // Temporary reader to get the backend type @@ -55,8 +52,8 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion return motionBackendType switch { - MotionInputBackendType.GamepadDriver => JsonSerializer.Deserialize(ref reader, SerializerContext.StandardMotionConfigController), - MotionInputBackendType.CemuHook => JsonSerializer.Deserialize(ref reader, SerializerContext.CemuHookMotionConfigController), + MotionInputBackendType.GamepadDriver => (MotionConfigController)JsonSerializer.Deserialize(ref reader, typeof(StandardMotionConfigController), options), + MotionInputBackendType.CemuHook => (MotionConfigController)JsonSerializer.Deserialize(ref reader, typeof(CemuHookMotionConfigController), options), _ => throw new InvalidOperationException($"Unknown backend type {motionBackendType}"), }; } @@ -66,10 +63,10 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion switch (value.MotionBackend) { case MotionInputBackendType.GamepadDriver: - JsonSerializer.Serialize(writer, value as StandardMotionConfigController, SerializerContext.StandardMotionConfigController); + JsonSerializer.Serialize(writer, value as StandardMotionConfigController, options); break; case MotionInputBackendType.CemuHook: - JsonSerializer.Serialize(writer, value as CemuHookMotionConfigController, SerializerContext.CemuHookMotionConfigController); + JsonSerializer.Serialize(writer, value as CemuHookMotionConfigController, options); break; default: throw new ArgumentException($"Unknown motion backend type {value.MotionBackend}"); diff --git a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigController.cs b/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigController.cs index 7636aa41..832aae0d 100644 --- a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigController.cs +++ b/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigController.cs @@ -1,8 +1,5 @@ -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration.Hid.Controller.Motion +namespace Ryujinx.Common.Configuration.Hid.Controller.Motion { - [JsonConverter(typeof(JsonMotionConfigControllerConverter))] public class MotionConfigController { public MotionInputBackendType MotionBackend { get; set; } diff --git a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigJsonSerializerContext.cs b/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigJsonSerializerContext.cs deleted file mode 100644 index 5cd9e452..00000000 --- a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionConfigJsonSerializerContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration.Hid.Controller.Motion -{ - [JsonSourceGenerationOptions(WriteIndented = true)] - [JsonSerializable(typeof(MotionConfigController))] - [JsonSerializable(typeof(CemuHookMotionConfigController))] - [JsonSerializable(typeof(StandardMotionConfigController))] - public partial class MotionConfigJsonSerializerContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionInputBackendType.cs b/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionInputBackendType.cs index c6551047..45d654ed 100644 --- a/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionInputBackendType.cs +++ b/Ryujinx.Common/Configuration/Hid/Controller/Motion/MotionInputBackendType.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration.Hid.Controller.Motion +namespace Ryujinx.Common.Configuration.Hid.Controller.Motion { - [JsonConverter(typeof(TypedStringEnumConverter<MotionInputBackendType>))] public enum MotionInputBackendType : byte { Invalid, diff --git a/Ryujinx.Common/Configuration/Hid/ControllerType.cs b/Ryujinx.Common/Configuration/Hid/ControllerType.cs index 70f811c8..0ad01bbb 100644 --- a/Ryujinx.Common/Configuration/Hid/ControllerType.cs +++ b/Ryujinx.Common/Configuration/Hid/ControllerType.cs @@ -1,12 +1,9 @@ -using Ryujinx.Common.Utilities; using System; -using System.Text.Json.Serialization; namespace Ryujinx.Common.Configuration.Hid { - // This enum was duplicated from Ryujinx.HLE.HOS.Services.Hid.PlayerIndex and should be kept identical [Flags] - [JsonConverter(typeof(TypedStringEnumConverter<ControllerType>))] + // This enum was duplicated from Ryujinx.HLE.HOS.Services.Hid.PlayerIndex and should be kept identical public enum ControllerType : int { None, diff --git a/Ryujinx.Common/Configuration/Hid/InputBackendType.cs b/Ryujinx.Common/Configuration/Hid/InputBackendType.cs index 1db3f570..9e944f9e 100644 --- a/Ryujinx.Common/Configuration/Hid/InputBackendType.cs +++ b/Ryujinx.Common/Configuration/Hid/InputBackendType.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration.Hid +namespace Ryujinx.Common.Configuration.Hid { - [JsonConverter(typeof(TypedStringEnumConverter<InputBackendType>))] public enum InputBackendType { Invalid, diff --git a/Ryujinx.Common/Configuration/Hid/InputConfig.cs b/Ryujinx.Common/Configuration/Hid/InputConfig.cs index 16c8f8e3..3364e35f 100644 --- a/Ryujinx.Common/Configuration/Hid/InputConfig.cs +++ b/Ryujinx.Common/Configuration/Hid/InputConfig.cs @@ -1,10 +1,8 @@ using System.ComponentModel; using System.Runtime.CompilerServices; -using System.Text.Json.Serialization; namespace Ryujinx.Common.Configuration.Hid { - [JsonConverter(typeof(JsonInputConfigConverter))] public class InputConfig : INotifyPropertyChanged { /// <summary> diff --git a/Ryujinx.Common/Configuration/Hid/InputConfigJsonSerializerContext.cs b/Ryujinx.Common/Configuration/Hid/InputConfigJsonSerializerContext.cs deleted file mode 100644 index 254c4feb..00000000 --- a/Ryujinx.Common/Configuration/Hid/InputConfigJsonSerializerContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Ryujinx.Common.Configuration.Hid.Controller; -using Ryujinx.Common.Configuration.Hid.Keyboard; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration.Hid -{ - [JsonSourceGenerationOptions(WriteIndented = true)] - [JsonSerializable(typeof(InputConfig))] - [JsonSerializable(typeof(StandardKeyboardInputConfig))] - [JsonSerializable(typeof(StandardControllerInputConfig))] - public partial class InputConfigJsonSerializerContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Configuration/Hid/JsonInputConfigConverter.cs b/Ryujinx.Common/Configuration/Hid/JsonInputConfigConverter.cs index 08bbcbf1..7223ad45 100644 --- a/Ryujinx.Common/Configuration/Hid/JsonInputConfigConverter.cs +++ b/Ryujinx.Common/Configuration/Hid/JsonInputConfigConverter.cs @@ -1,16 +1,13 @@ using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Keyboard; -using Ryujinx.Common.Utilities; using System; using System.Text.Json; using System.Text.Json.Serialization; namespace Ryujinx.Common.Configuration.Hid { - public class JsonInputConfigConverter : JsonConverter<InputConfig> + class JsonInputConfigConverter : JsonConverter<InputConfig> { - private static readonly InputConfigJsonSerializerContext SerializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - private static InputBackendType GetInputBackendType(ref Utf8JsonReader reader) { // Temporary reader to get the backend type @@ -57,8 +54,8 @@ namespace Ryujinx.Common.Configuration.Hid return backendType switch { - InputBackendType.WindowKeyboard => JsonSerializer.Deserialize(ref reader, SerializerContext.StandardKeyboardInputConfig), - InputBackendType.GamepadSDL2 => JsonSerializer.Deserialize(ref reader, SerializerContext.StandardControllerInputConfig), + InputBackendType.WindowKeyboard => (InputConfig)JsonSerializer.Deserialize(ref reader, typeof(StandardKeyboardInputConfig), options), + InputBackendType.GamepadSDL2 => (InputConfig)JsonSerializer.Deserialize(ref reader, typeof(StandardControllerInputConfig), options), _ => throw new InvalidOperationException($"Unknown backend type {backendType}"), }; } @@ -68,10 +65,10 @@ namespace Ryujinx.Common.Configuration.Hid switch (value.Backend) { case InputBackendType.WindowKeyboard: - JsonSerializer.Serialize(writer, value as StandardKeyboardInputConfig, SerializerContext.StandardKeyboardInputConfig); + JsonSerializer.Serialize(writer, value as StandardKeyboardInputConfig, options); break; case InputBackendType.GamepadSDL2: - JsonSerializer.Serialize(writer, value as StandardControllerInputConfig, SerializerContext.StandardControllerInputConfig); + JsonSerializer.Serialize(writer, value as StandardControllerInputConfig, options); break; default: throw new ArgumentException($"Unknown backend type {value.Backend}"); diff --git a/Ryujinx.Common/Configuration/Hid/PlayerIndex.cs b/Ryujinx.Common/Configuration/Hid/PlayerIndex.cs index dd6495d4..2e34cb96 100644 --- a/Ryujinx.Common/Configuration/Hid/PlayerIndex.cs +++ b/Ryujinx.Common/Configuration/Hid/PlayerIndex.cs @@ -1,10 +1,6 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - namespace Ryujinx.Common.Configuration.Hid { // This enum was duplicated from Ryujinx.HLE.HOS.Services.Hid.PlayerIndex and should be kept identical - [JsonConverter(typeof(TypedStringEnumConverter<PlayerIndex>))] public enum PlayerIndex : int { Player1 = 0, diff --git a/Ryujinx.Common/Configuration/MemoryManagerMode.cs b/Ryujinx.Common/Configuration/MemoryManagerMode.cs index f10fd6f1..ad6c2a34 100644 --- a/Ryujinx.Common/Configuration/MemoryManagerMode.cs +++ b/Ryujinx.Common/Configuration/MemoryManagerMode.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration +namespace Ryujinx.Common.Configuration { - [JsonConverter(typeof(TypedStringEnumConverter<MemoryManagerMode>))] public enum MemoryManagerMode : byte { SoftwarePageTable, diff --git a/Ryujinx.Common/Configuration/TitleUpdateMetadataJsonSerializerContext.cs b/Ryujinx.Common/Configuration/TitleUpdateMetadataJsonSerializerContext.cs deleted file mode 100644 index 5b661b87..00000000 --- a/Ryujinx.Common/Configuration/TitleUpdateMetadataJsonSerializerContext.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Configuration -{ - [JsonSourceGenerationOptions(WriteIndented = true)] - [JsonSerializable(typeof(TitleUpdateMetadata))] - public partial class TitleUpdateMetadataJsonSerializerContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs index 28a7d546..b9a08323 100644 --- a/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs +++ b/Ryujinx.Common/Logging/Formatters/DefaultLogFormatter.cs @@ -1,20 +1,22 @@ -using System.Text; +using System; +using System.Reflection; +using System.Text; namespace Ryujinx.Common.Logging { internal class DefaultLogFormatter : ILogFormatter { - private static readonly ObjectPool<StringBuilder> StringBuilderPool = SharedPools.Default<StringBuilder>(); + private static readonly ObjectPool<StringBuilder> _stringBuilderPool = SharedPools.Default<StringBuilder>(); public string Format(LogEventArgs args) { - StringBuilder sb = StringBuilderPool.Allocate(); + StringBuilder sb = _stringBuilderPool.Allocate(); try { sb.Clear(); - sb.Append($@"{args.Time:hh\:mm\:ss\.fff}"); + sb.AppendFormat(@"{0:hh\:mm\:ss\.fff}", args.Time); sb.Append($" |{args.Level.ToString()[0]}| "); if (args.ThreadName != null) @@ -25,17 +27,53 @@ namespace Ryujinx.Common.Logging sb.Append(args.Message); - if (args.Data is not null) + if (args.Data != null) { - sb.Append(' '); - DynamicObjectFormatter.Format(sb, args.Data); + PropertyInfo[] props = args.Data.GetType().GetProperties(); + + sb.Append(" {"); + + foreach (var prop in props) + { + sb.Append(prop.Name); + sb.Append(": "); + + if (typeof(Array).IsAssignableFrom(prop.PropertyType)) + { + Array array = (Array)prop.GetValue(args.Data); + foreach (var item in array) + { + sb.Append(item.ToString()); + sb.Append(", "); + } + + if (array.Length > 0) + { + sb.Remove(sb.Length - 2, 2); + } + } + else + { + sb.Append(prop.GetValue(args.Data)); + } + + sb.Append(" ; "); + } + + // We remove the final ';' from the string + if (props.Length > 0) + { + sb.Remove(sb.Length - 3, 3); + } + + sb.Append('}'); } return sb.ToString(); } finally { - StringBuilderPool.Release(sb); + _stringBuilderPool.Release(sb); } } } diff --git a/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs b/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs deleted file mode 100644 index 5f15cc2a..00000000 --- a/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs +++ /dev/null @@ -1,84 +0,0 @@ -#nullable enable -using System; -using System.Reflection; -using System.Text; - -namespace Ryujinx.Common.Logging -{ - internal class DynamicObjectFormatter - { - private static readonly ObjectPool<StringBuilder> StringBuilderPool = SharedPools.Default<StringBuilder>(); - - public static string? Format(object? dynamicObject) - { - if (dynamicObject is null) - { - return null; - } - - StringBuilder sb = StringBuilderPool.Allocate(); - - try - { - Format(sb, dynamicObject); - - return sb.ToString(); - } - finally - { - StringBuilderPool.Release(sb); - } - } - - public static void Format(StringBuilder sb, object? dynamicObject) - { - if (dynamicObject is null) - { - return; - } - - PropertyInfo[] props = dynamicObject.GetType().GetProperties(); - - sb.Append('{'); - - foreach (var prop in props) - { - sb.Append(prop.Name); - sb.Append(": "); - - if (typeof(Array).IsAssignableFrom(prop.PropertyType)) - { - Array? array = (Array?) prop.GetValue(dynamicObject); - - if (array is not null) - { - foreach (var item in array) - { - sb.Append(item); - sb.Append(", "); - } - - if (array.Length > 0) - { - sb.Remove(sb.Length - 2, 2); - } - } - } - else - { - sb.Append(prop.GetValue(dynamicObject)); - } - - sb.Append(" ; "); - } - - // We remove the final ';' from the string - if (props.Length > 0) - { - sb.Remove(sb.Length - 3, 3); - } - - sb.Append('}'); - } - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogClass.cs b/Ryujinx.Common/Logging/LogClass.cs index e62676cd..7e53c972 100644 --- a/Ryujinx.Common/Logging/LogClass.cs +++ b/Ryujinx.Common/Logging/LogClass.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - namespace Ryujinx.Common.Logging { - [JsonConverter(typeof(TypedStringEnumConverter<LogClass>))] public enum LogClass { Application, diff --git a/Ryujinx.Common/Logging/LogEventArgs.cs b/Ryujinx.Common/Logging/LogEventArgs.cs index a27af780..511c8e6e 100644 --- a/Ryujinx.Common/Logging/LogEventArgs.cs +++ b/Ryujinx.Common/Logging/LogEventArgs.cs @@ -11,7 +11,15 @@ namespace Ryujinx.Common.Logging public readonly string Message; public readonly object Data; - public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message, object data = null) + public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message) + { + Level = level; + Time = time; + ThreadName = threadName; + Message = message; + } + + public LogEventArgs(LogLevel level, TimeSpan time, string threadName, string message, object data) { Level = level; Time = time; diff --git a/Ryujinx.Common/Logging/LogEventArgsJson.cs b/Ryujinx.Common/Logging/LogEventArgsJson.cs deleted file mode 100644 index 425b9766..00000000 --- a/Ryujinx.Common/Logging/LogEventArgsJson.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Logging -{ - internal class LogEventArgsJson - { - public LogLevel Level { get; } - public TimeSpan Time { get; } - public string ThreadName { get; } - - public string Message { get; } - public string Data { get; } - - [JsonConstructor] - public LogEventArgsJson(LogLevel level, TimeSpan time, string threadName, string message, string data = null) - { - Level = level; - Time = time; - ThreadName = threadName; - Message = message; - Data = data; - } - - public static LogEventArgsJson FromLogEventArgs(LogEventArgs args) - { - return new LogEventArgsJson(args.Level, args.Time, args.ThreadName, args.Message, DynamicObjectFormatter.Format(args.Data)); - } - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs b/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs deleted file mode 100644 index da21f11e..00000000 --- a/Ryujinx.Common/Logging/LogEventJsonSerializerContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Logging -{ - [JsonSerializable(typeof(LogEventArgsJson))] - internal partial class LogEventJsonSerializerContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Logging/LogLevel.cs b/Ryujinx.Common/Logging/LogLevel.cs index 3786c756..8857fb45 100644 --- a/Ryujinx.Common/Logging/LogLevel.cs +++ b/Ryujinx.Common/Logging/LogLevel.cs @@ -1,9 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - namespace Ryujinx.Common.Logging { - [JsonConverter(typeof(TypedStringEnumConverter<LogLevel>))] public enum LogLevel { Debug, diff --git a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs index 06976433..95f96576 100644 --- a/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs +++ b/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs @@ -1,5 +1,5 @@ -using Ryujinx.Common.Utilities; -using System.IO; +using System.IO; +using System.Text.Json; namespace Ryujinx.Common.Logging { @@ -25,8 +25,12 @@ namespace Ryujinx.Common.Logging public void Log(object sender, LogEventArgs e) { - var logEventArgsJson = LogEventArgsJson.FromLogEventArgs(e); - JsonHelper.SerializeToStream(_stream, logEventArgsJson, LogEventJsonSerializerContext.Default.LogEventArgsJson); + string text = JsonSerializer.Serialize(e); + + using (BinaryWriter writer = new BinaryWriter(_stream)) + { + writer.Write(text); + } } public void Dispose() diff --git a/Ryujinx.Common/Utilities/CommonJsonContext.cs b/Ryujinx.Common/Utilities/CommonJsonContext.cs deleted file mode 100644 index d7b3f78c..00000000 --- a/Ryujinx.Common/Utilities/CommonJsonContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Utilities -{ - [JsonSerializable(typeof(string[]), TypeInfoPropertyName = "StringArray")] - [JsonSerializable(typeof(Dictionary<string, string>), TypeInfoPropertyName = "StringDictionary")] - public partial class CommonJsonContext : JsonSerializerContext - { - } -}
\ No newline at end of file diff --git a/Ryujinx.Common/Utilities/JsonHelper.cs b/Ryujinx.Common/Utilities/JsonHelper.cs index 9a2d6f18..36f39114 100644 --- a/Ryujinx.Common/Utilities/JsonHelper.cs +++ b/Ryujinx.Common/Utilities/JsonHelper.cs @@ -1,62 +1,15 @@ -using System.IO; +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller.Motion; +using System.IO; using System.Text; using System.Text.Json; -using System.Text.Json.Serialization.Metadata; +using System.Text.Json.Serialization; namespace Ryujinx.Common.Utilities { public class JsonHelper { - private static readonly JsonNamingPolicy SnakeCasePolicy = new SnakeCaseNamingPolicy(); - private const int DefaultFileWriteBufferSize = 4096; - - /// <summary> - /// Creates new serializer options with default settings. - /// </summary> - /// <remarks> - /// It is REQUIRED for you to save returned options statically or as a part of static serializer context - /// in order to avoid performance issues. You can safely modify returned options for your case before storing. - /// </remarks> - public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true) - { - JsonSerializerOptions options = new() - { - DictionaryKeyPolicy = SnakeCasePolicy, - PropertyNamingPolicy = SnakeCasePolicy, - WriteIndented = indented, - AllowTrailingCommas = true, - ReadCommentHandling = JsonCommentHandling.Skip - }; - - return options; - } - - public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) - { - return JsonSerializer.Serialize(value, typeInfo); - } - - public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) - { - return JsonSerializer.Deserialize(value, typeInfo); - } - - public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo) - { - using FileStream file = File.Create(filePath, DefaultFileWriteBufferSize, FileOptions.WriteThrough); - JsonSerializer.Serialize(file, value, typeInfo); - } - - public static T DeserializeFromFile<T>(string filePath, JsonTypeInfo<T> typeInfo) - { - using FileStream file = File.OpenRead(filePath); - return JsonSerializer.Deserialize(file, typeInfo); - } - - public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo) - { - JsonSerializer.Serialize(stream, value, typeInfo); - } + public static JsonNamingPolicy SnakeCase { get; } private class SnakeCaseNamingPolicy : JsonNamingPolicy { @@ -67,7 +20,7 @@ namespace Ryujinx.Common.Utilities return name; } - StringBuilder builder = new(); + StringBuilder builder = new StringBuilder(); for (int i = 0; i < name.Length; i++) { @@ -81,7 +34,7 @@ namespace Ryujinx.Common.Utilities } else { - builder.Append('_'); + builder.Append("_"); builder.Append(char.ToLowerInvariant(c)); } } @@ -94,5 +47,64 @@ namespace Ryujinx.Common.Utilities return builder.ToString(); } } + + static JsonHelper() + { + SnakeCase = new SnakeCaseNamingPolicy(); + } + + public static JsonSerializerOptions GetDefaultSerializerOptions(bool prettyPrint = false) + { + JsonSerializerOptions options = new JsonSerializerOptions + { + DictionaryKeyPolicy = SnakeCase, + PropertyNamingPolicy = SnakeCase, + WriteIndented = prettyPrint, + AllowTrailingCommas = true, + ReadCommentHandling = JsonCommentHandling.Skip + }; + + options.Converters.Add(new JsonStringEnumConverter()); + options.Converters.Add(new JsonInputConfigConverter()); + options.Converters.Add(new JsonMotionConfigControllerConverter()); + + return options; + } + + public static T Deserialize<T>(Stream stream) + { + using (BinaryReader reader = new BinaryReader(stream)) + { + return JsonSerializer.Deserialize<T>(reader.ReadBytes((int)(stream.Length - stream.Position)), GetDefaultSerializerOptions()); + } + } + + public static T DeserializeFromFile<T>(string path) + { + return Deserialize<T>(File.ReadAllText(path)); + } + + public static T Deserialize<T>(string json) + { + return JsonSerializer.Deserialize<T>(json, GetDefaultSerializerOptions()); + } + + public static void Serialize<TValue>(Stream stream, TValue obj, bool prettyPrint = false) + { + using (BinaryWriter writer = new BinaryWriter(stream)) + { + writer.Write(SerializeToUtf8Bytes(obj, prettyPrint)); + } + } + + public static string Serialize<TValue>(TValue obj, bool prettyPrint = false) + { + return JsonSerializer.Serialize(obj, GetDefaultSerializerOptions(prettyPrint)); + } + + public static byte[] SerializeToUtf8Bytes<T>(T obj, bool prettyPrint = false) + { + return JsonSerializer.SerializeToUtf8Bytes(obj, GetDefaultSerializerOptions(prettyPrint)); + } } -}
\ No newline at end of file +} diff --git a/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs b/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs deleted file mode 100644 index c0127dc4..00000000 --- a/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs +++ /dev/null @@ -1,34 +0,0 @@ -#nullable enable -using System; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Ryujinx.Common.Utilities -{ - /// <summary> - /// Specifies that value of <see cref="TEnum"/> will be serialized as string in JSONs - /// </summary> - /// <remarks> - /// Trimming friendly alternative to <see cref="JsonStringEnumConverter"/>. - /// Get rid of this converter if dotnet supports similar functionality out of the box. - /// </remarks> - /// <typeparam name="TEnum">Type of enum to serialize</typeparam> - public sealed class TypedStringEnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum - { - public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var enumValue = reader.GetString(); - if (string.IsNullOrEmpty(enumValue)) - { - return default; - } - - return Enum.Parse<TEnum>(enumValue); - } - - public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString()); - } - } -} |
