Skip to content

Commit

Permalink
chore: use YamlDeserializer as singleton
Browse files Browse the repository at this point in the history
  • Loading branch information
filzrev committed Feb 26, 2025
1 parent e42210d commit 2a2ed1d
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 15 deletions.
3 changes: 2 additions & 1 deletion src/Docfx.Build/ApiPage/ApiPageProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ namespace Docfx.Build.ApiPage;

class ApiPageDocumentProcessor(IMarkdownService markdownService) : IDocumentProcessor
{
private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build();

IEnumerable<IDocumentBuildStep> IDocumentProcessor.BuildSteps => Array.Empty<IDocumentBuildStep>();
void IDocumentProcessor.UpdateHref(FileModel model, IDocumentBuildContext context) { }

Expand All @@ -35,7 +37,6 @@ public ProcessingPriority GetProcessingPriority(FileAndType file)

public FileModel Load(FileAndType file, ImmutableDictionary<string, object> metadata)
{
var deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build();
var yml = EnvironmentContext.FileAbstractLayer.ReadAllText(file.File);
var json = JsonSerializer.Serialize(deserializer.Deserialize<object>(yml));
var data = JsonSerializer.Deserialize<ApiPage>(json, ApiPage.JsonSerializerOptions);
Expand Down
12 changes: 6 additions & 6 deletions src/Docfx.Common/YamlUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ namespace Docfx.Common;

public static class YamlUtility
{
private static readonly ThreadLocal<YamlSerializer> serializer = new(() => new YamlSerializer(SerializationOptions.DisableAliases));
private static readonly ThreadLocal<YamlDeserializer> 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)
{
Expand All @@ -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)
Expand All @@ -41,7 +41,7 @@ public static void Serialize(string path, object graph, string comments)

public static T Deserialize<T>(TextReader reader)
{
return deserializer.Value.Deserialize<T>(reader);
return deserializer.Deserialize<T>(reader);
}

public static T Deserialize<T>(string path)
Expand All @@ -55,8 +55,8 @@ public static T ConvertTo<T>(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<T>(new StringReader(sb.ToString()));
return deserializer.Deserialize<T>(new StringReader(sb.ToString()));
}
}
5 changes: 3 additions & 2 deletions src/Docfx.Dotnet/DotnetApiCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ namespace Docfx.Dotnet;
/// </summary>
public static partial class DotnetApiCatalog
{
private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build();

/// <summary>
/// Generates metadata reference YAML files using docfx.json config.
/// </summary>
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ namespace docfx.Tests;

public partial class YamlSerializationTest
{
private static IDeserializer deserializer = new DeserializerBuilder().WithAttemptingUnquotedStringTypeDeserialization().Build();

[Theory]
[TestData<ApiPage>]
public void YamlSerializationTest_ApiPage(string path)
Expand All @@ -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
Expand All @@ -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);

Expand All @@ -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<Dictionary<object, object>>(new StringReader(yaml));
var json = JsonSerializer.Serialize(dict);
return JsonSerializer.Deserialize<ApiPage>(json, ApiPage.JsonSerializerOptions);
Expand Down

0 comments on commit 2a2ed1d

Please sign in to comment.