src/Bicep.Types/Serialization/TypeSerializer.cs (50 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Azure.Bicep.Types.Concrete; using Azure.Bicep.Types.Index; namespace Azure.Bicep.Types.Serialization; public static class TypeSerializer { public static JsonSerializerOptions GetSerializerOptions(TypeFactory? factory = null) { factory ??= new(Enumerable.Empty<TypeBase>()); return new JsonSerializerOptions { Converters = { new TypeReferenceConverter(factory), new CrossFileTypeReferenceConverter(), }, PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true, TypeInfoResolver = TypeJsonContext.Default, }; } public static void Serialize(Stream stream, TypeBase[] types) { var options = GetSerializerOptions(new(types)); JsonSerializer.Serialize(stream, types, options); } public static TypeBase[] Deserialize(Stream contentStream) { var factory = new TypeFactory(Enumerable.Empty<TypeBase>()); var options = GetSerializerOptions(factory); var types = JsonSerializer.Deserialize<TypeBase[]>(contentStream, options) ?? throw new JsonException("Failed to deserialize content"); factory.Hydrate(types); return types; } public static TypeIndex DeserializeIndex(Stream contentStream) { var options = GetSerializerOptions(); return JsonSerializer.Deserialize<TypeIndex>(contentStream, options) ?? throw new JsonException("Failed to deserialize index"); } public static void SerializeIndex(Stream stream, TypeIndex index) { var options = GetSerializerOptions(); JsonSerializer.Serialize(stream, index, options); } }