diff options
author | Andrey Sukharev <SukharevAndrey@users.noreply.github.com> | 2023-04-03 13:14:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-03 10:14:19 +0000 |
commit | 3249f8ff41446b47cf458bbc04f8c27e005889aa (patch) | |
tree | 72e1087e8b58afe416d66afb6b7a3c4761bef425 /Ryujinx.Common/Utilities/JsonHelper.cs | |
parent | 1b41b285ac7f551c3495ced436ce3930ad7223b4 (diff) |
Source generated json serializers (#4582)1.1.693
* Use source generated json serializers in order to improve code trimming
* Use strongly typed github releases model to fetch updates instead of raw Newtonsoft.Json parsing
* Use separate model for LogEventArgs serialization
* Make dynamic object formatter static. Fix string builder pooling.
* Do not inherit json version of LogEventArgs from EventArgs
* Fix extra space in object formatting
* Write log json directly to stream instead of using buffer writer
* Rebase fixes
* Rebase fixes
* Rebase fixes
* Enforce block-scoped namespaces in the solution. Convert style for existing code
* Apply suggestions from code review
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Rebase indent fix
* Fix indent
* Delete unnecessary json properties
* Rebase fix
* Remove overridden json property names as they are handled in the options
* Apply suggestions from code review
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Use default json options in github api calls
* Indentation and spacing fixes
* Fix json serialization
* Fix missing JsonConverter for config enums
* Add double \n\n after the whole string, not inside join
---------
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.Common/Utilities/JsonHelper.cs')
-rw-r--r-- | Ryujinx.Common/Utilities/JsonHelper.cs | 122 |
1 files changed, 55 insertions, 67 deletions
diff --git a/Ryujinx.Common/Utilities/JsonHelper.cs b/Ryujinx.Common/Utilities/JsonHelper.cs index 36f39114..9a2d6f18 100644 --- a/Ryujinx.Common/Utilities/JsonHelper.cs +++ b/Ryujinx.Common/Utilities/JsonHelper.cs @@ -1,15 +1,62 @@ -using Ryujinx.Common.Configuration.Hid; -using Ryujinx.Common.Configuration.Hid.Controller.Motion; -using System.IO; +using System.IO; using System.Text; using System.Text.Json; -using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; namespace Ryujinx.Common.Utilities { public class JsonHelper { - public static JsonNamingPolicy SnakeCase { get; } + 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); + } private class SnakeCaseNamingPolicy : JsonNamingPolicy { @@ -20,7 +67,7 @@ namespace Ryujinx.Common.Utilities return name; } - StringBuilder builder = new StringBuilder(); + StringBuilder builder = new(); for (int i = 0; i < name.Length; i++) { @@ -34,7 +81,7 @@ namespace Ryujinx.Common.Utilities } else { - builder.Append("_"); + builder.Append('_'); builder.Append(char.ToLowerInvariant(c)); } } @@ -47,64 +94,5 @@ 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 |