From 2a2ed1d7b24efe74d8d9d2b479e2387ae1778841 Mon Sep 17 00:00:00 2001 From: filzrev <103790468+filzrev@users.noreply.github.com> Date: Thu, 27 Feb 2025 04:48:44 +0900 Subject: [PATCH] chore: use YamlDeserializer as singleton --- src/Docfx.Build/ApiPage/ApiPageProcessor.cs | 3 ++- src/Docfx.Common/YamlUtility.cs | 12 ++++++------ src/Docfx.Dotnet/DotnetApiCatalog.cs | 5 +++-- .../YamlSerializationTest.ApiPage.cs | 8 ++------ 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Docfx.Build/ApiPage/ApiPageProcessor.cs b/src/Docfx.Build/ApiPage/ApiPageProcessor.cs index 115bdd30127..e84aee5cf76 100644 --- a/src/Docfx.Build/ApiPage/ApiPageProcessor.cs +++ b/src/Docfx.Build/ApiPage/ApiPageProcessor.cs @@ -11,6 +11,8 @@ namespace Docfx.Build.ApiPage; class ApiPageDocumentProcessor(IMarkdownService markdownService) : IDocumentProcessor { + private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); + IEnumerable IDocumentProcessor.BuildSteps => Array.Empty(); void IDocumentProcessor.UpdateHref(FileModel model, IDocumentBuildContext context) { } @@ -35,7 +37,6 @@ public ProcessingPriority GetProcessingPriority(FileAndType file) public FileModel Load(FileAndType file, ImmutableDictionary metadata) { - var deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); var yml = EnvironmentContext.FileAbstractLayer.ReadAllText(file.File); var json = JsonSerializer.Serialize(deserializer.Deserialize(yml)); var data = JsonSerializer.Deserialize(json, ApiPage.JsonSerializerOptions); diff --git a/src/Docfx.Common/YamlUtility.cs b/src/Docfx.Common/YamlUtility.cs index d93726e1768..54599fcf582 100644 --- a/src/Docfx.Common/YamlUtility.cs +++ b/src/Docfx.Common/YamlUtility.cs @@ -12,8 +12,8 @@ namespace Docfx.Common; public static class YamlUtility { - private static readonly ThreadLocal serializer = new(() => new YamlSerializer(SerializationOptions.DisableAliases)); - private static readonly ThreadLocal deserializer = new(() => new YamlDeserializer(ignoreUnmatched: true)); + private static readonly YamlSerializer serializer = new(SerializationOptions.DisableAliases); + private static readonly YamlDeserializer deserializer = new(ignoreUnmatched: true); public static void Serialize(TextWriter writer, object graph) { @@ -30,7 +30,7 @@ public static void Serialize(TextWriter writer, object graph, string comments) writer.WriteLine(comment.TrimEnd('\r')); } } - serializer.Value.Serialize(writer, graph); + serializer.Serialize(writer, graph); } public static void Serialize(string path, object graph, string comments) @@ -41,7 +41,7 @@ public static void Serialize(string path, object graph, string comments) public static T Deserialize(TextReader reader) { - return deserializer.Value.Deserialize(reader); + return deserializer.Deserialize(reader); } public static T Deserialize(string path) @@ -55,8 +55,8 @@ public static T ConvertTo(object obj) var sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { - serializer.Value.Serialize(writer, obj); + serializer.Serialize(writer, obj); } - return deserializer.Value.Deserialize(new StringReader(sb.ToString())); + return deserializer.Deserialize(new StringReader(sb.ToString())); } } diff --git a/src/Docfx.Dotnet/DotnetApiCatalog.cs b/src/Docfx.Dotnet/DotnetApiCatalog.cs index 1a1ffe66aae..5d2fb237e8b 100644 --- a/src/Docfx.Dotnet/DotnetApiCatalog.cs +++ b/src/Docfx.Dotnet/DotnetApiCatalog.cs @@ -15,6 +15,8 @@ namespace Docfx.Dotnet; /// public static partial class DotnetApiCatalog { + private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); + /// /// Generates metadata reference YAML files using docfx.json config. /// @@ -96,13 +98,12 @@ void WriteMarkdown(string outputFolder, string id, Build.ApiPage.ApiPage apiPage break; case MetadataOutputFormat.ApiPage: - var serializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); CreatePages(WriteYaml, assemblies, config, options); void WriteYaml(string outputFolder, string id, Build.ApiPage.ApiPage apiPage) { var json = JsonSerializer.Serialize(apiPage, Docfx.Build.ApiPage.ApiPage.JsonSerializerOptions); - var obj = serializer.Deserialize(json); + var obj = deserializer.Deserialize(json); YamlUtility.Serialize(Path.Combine(outputFolder, $"{id}.yml"), obj, "YamlMime:ApiPage"); } break; diff --git a/test/docfx.Tests/SerializationTests/YamlSerializationTest.ApiPage.cs b/test/docfx.Tests/SerializationTests/YamlSerializationTest.ApiPage.cs index f78caa12072..2230c9d82b2 100644 --- a/test/docfx.Tests/SerializationTests/YamlSerializationTest.ApiPage.cs +++ b/test/docfx.Tests/SerializationTests/YamlSerializationTest.ApiPage.cs @@ -12,6 +12,8 @@ namespace docfx.Tests; public partial class YamlSerializationTest { + private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); + [Theory] [TestData] public void YamlSerializationTest_ApiPage(string path) @@ -30,9 +32,6 @@ private static ApiPage LoadApiPage(string path) { path = PathHelper.ResolveTestDataPath(path); - var deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization() - .Build(); - // 1. Deserialize ApiPage yaml as Dictionary // 2. Serialize to json // 3. Deserialize as ApiPage instance @@ -56,8 +55,6 @@ private static void ValidateApiPageRoundTrip(ApiPage model) private static string ToYaml(ApiPage model) { - var deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); - var json = JsonSerializer.Serialize(model, Docfx.Build.ApiPage.ApiPage.JsonSerializerOptions); var obj = deserializer.Deserialize(json); @@ -68,7 +65,6 @@ private static string ToYaml(ApiPage model) private static ApiPage ToApiPage(string yaml) { - var deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build(); var dict = deserializer.Deserialize>(new StringReader(yaml)); var json = JsonSerializer.Serialize(dict); return JsonSerializer.Deserialize(json, ApiPage.JsonSerializerOptions);