diff --git a/sdk/core/Azure.Core/api/Azure.Core.net461.cs b/sdk/core/Azure.Core/api/Azure.Core.net461.cs index acc1711eb1af..743aea3e7f54 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net461.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net461.cs @@ -1131,9 +1131,8 @@ public enum JsonPropertyNames } public partial class ModelJsonConverter : System.Text.Json.Serialization.JsonConverter { - public ModelJsonConverter() { } - public ModelJsonConverter(bool ignoreAdditionalProperties) { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } + public ModelJsonConverter(string format = "D") { } + public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Serialization.IModelSerializable Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Serialization.IModelSerializable value, System.Text.Json.JsonSerializerOptions options) { } @@ -1143,11 +1142,29 @@ public static partial class ModelSerializer public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } public static System.BinaryData Serialize(T model, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } } + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public readonly partial struct ModelSerializerFormat : System.IEquatable + { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Data; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Wire; + public ModelSerializerFormat(string value) { throw null; } + public bool Equals(Azure.Core.Serialization.ModelSerializerFormat other) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override bool Equals(object obj) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override int GetHashCode() { throw null; } + public static bool operator ==(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public static implicit operator string (Azure.Core.Serialization.ModelSerializerFormat value) { throw null; } + public static implicit operator Azure.Core.Serialization.ModelSerializerFormat (string value) { throw null; } + public static bool operator !=(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public override string ToString() { throw null; } + } public partial class ModelSerializerOptions { - public ModelSerializerOptions() { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } - public bool IgnoreReadOnlyProperties { get { throw null; } set { } } + public Azure.Core.Serialization.ModelSerializerFormat Format; + public ModelSerializerOptions(string format = "D") { } public System.Collections.Generic.Dictionary Serializers { get { throw null; } } } public abstract partial class ObjectSerializer diff --git a/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs index cb94b6adde8d..207aeec67c95 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs @@ -1131,9 +1131,8 @@ public enum JsonPropertyNames } public partial class ModelJsonConverter : System.Text.Json.Serialization.JsonConverter { - public ModelJsonConverter() { } - public ModelJsonConverter(bool ignoreAdditionalProperties) { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } + public ModelJsonConverter(string format = "D") { } + public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Serialization.IModelSerializable Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Serialization.IModelSerializable value, System.Text.Json.JsonSerializerOptions options) { } @@ -1143,11 +1142,29 @@ public static partial class ModelSerializer public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } public static System.BinaryData Serialize(T model, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } } + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public readonly partial struct ModelSerializerFormat : System.IEquatable + { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Data; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Wire; + public ModelSerializerFormat(string value) { throw null; } + public bool Equals(Azure.Core.Serialization.ModelSerializerFormat other) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override bool Equals([System.Diagnostics.CodeAnalysis.AllowNullAttribute] object obj) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override int GetHashCode() { throw null; } + public static bool operator ==(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public static implicit operator string (Azure.Core.Serialization.ModelSerializerFormat value) { throw null; } + public static implicit operator Azure.Core.Serialization.ModelSerializerFormat (string value) { throw null; } + public static bool operator !=(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public override string ToString() { throw null; } + } public partial class ModelSerializerOptions { - public ModelSerializerOptions() { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } - public bool IgnoreReadOnlyProperties { get { throw null; } set { } } + public Azure.Core.Serialization.ModelSerializerFormat Format; + public ModelSerializerOptions(string format = "D") { } public System.Collections.Generic.Dictionary Serializers { get { throw null; } } } public abstract partial class ObjectSerializer diff --git a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs index cb94b6adde8d..207aeec67c95 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs @@ -1131,9 +1131,8 @@ public enum JsonPropertyNames } public partial class ModelJsonConverter : System.Text.Json.Serialization.JsonConverter { - public ModelJsonConverter() { } - public ModelJsonConverter(bool ignoreAdditionalProperties) { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } + public ModelJsonConverter(string format = "D") { } + public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Serialization.IModelSerializable Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Serialization.IModelSerializable value, System.Text.Json.JsonSerializerOptions options) { } @@ -1143,11 +1142,29 @@ public static partial class ModelSerializer public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } public static System.BinaryData Serialize(T model, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } } + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public readonly partial struct ModelSerializerFormat : System.IEquatable + { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Data; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Wire; + public ModelSerializerFormat(string value) { throw null; } + public bool Equals(Azure.Core.Serialization.ModelSerializerFormat other) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override bool Equals([System.Diagnostics.CodeAnalysis.AllowNullAttribute] object obj) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override int GetHashCode() { throw null; } + public static bool operator ==(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public static implicit operator string (Azure.Core.Serialization.ModelSerializerFormat value) { throw null; } + public static implicit operator Azure.Core.Serialization.ModelSerializerFormat (string value) { throw null; } + public static bool operator !=(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public override string ToString() { throw null; } + } public partial class ModelSerializerOptions { - public ModelSerializerOptions() { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } - public bool IgnoreReadOnlyProperties { get { throw null; } set { } } + public Azure.Core.Serialization.ModelSerializerFormat Format; + public ModelSerializerOptions(string format = "D") { } public System.Collections.Generic.Dictionary Serializers { get { throw null; } } } public abstract partial class ObjectSerializer diff --git a/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs b/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs index acc1711eb1af..743aea3e7f54 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs @@ -1131,9 +1131,8 @@ public enum JsonPropertyNames } public partial class ModelJsonConverter : System.Text.Json.Serialization.JsonConverter { - public ModelJsonConverter() { } - public ModelJsonConverter(bool ignoreAdditionalProperties) { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } + public ModelJsonConverter(string format = "D") { } + public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Serialization.IModelSerializable Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Serialization.IModelSerializable value, System.Text.Json.JsonSerializerOptions options) { } @@ -1143,11 +1142,29 @@ public static partial class ModelSerializer public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } public static System.BinaryData Serialize(T model, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } } + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public readonly partial struct ModelSerializerFormat : System.IEquatable + { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Data; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Wire; + public ModelSerializerFormat(string value) { throw null; } + public bool Equals(Azure.Core.Serialization.ModelSerializerFormat other) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override bool Equals(object obj) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override int GetHashCode() { throw null; } + public static bool operator ==(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public static implicit operator string (Azure.Core.Serialization.ModelSerializerFormat value) { throw null; } + public static implicit operator Azure.Core.Serialization.ModelSerializerFormat (string value) { throw null; } + public static bool operator !=(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public override string ToString() { throw null; } + } public partial class ModelSerializerOptions { - public ModelSerializerOptions() { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } - public bool IgnoreReadOnlyProperties { get { throw null; } set { } } + public Azure.Core.Serialization.ModelSerializerFormat Format; + public ModelSerializerOptions(string format = "D") { } public System.Collections.Generic.Dictionary Serializers { get { throw null; } } } public abstract partial class ObjectSerializer diff --git a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs index acc1711eb1af..743aea3e7f54 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs @@ -1131,9 +1131,8 @@ public enum JsonPropertyNames } public partial class ModelJsonConverter : System.Text.Json.Serialization.JsonConverter { - public ModelJsonConverter() { } - public ModelJsonConverter(bool ignoreAdditionalProperties) { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } + public ModelJsonConverter(string format = "D") { } + public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Serialization.IModelSerializable Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Serialization.IModelSerializable value, System.Text.Json.JsonSerializerOptions options) { } @@ -1143,11 +1142,29 @@ public static partial class ModelSerializer public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } public static System.BinaryData Serialize(T model, Azure.Core.Serialization.ModelSerializerOptions? options = null) where T : class, Azure.Core.Serialization.IModelSerializable { throw null; } } + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public readonly partial struct ModelSerializerFormat : System.IEquatable + { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Data; + public static readonly Azure.Core.Serialization.ModelSerializerFormat Wire; + public ModelSerializerFormat(string value) { throw null; } + public bool Equals(Azure.Core.Serialization.ModelSerializerFormat other) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override bool Equals(object obj) { throw null; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public override int GetHashCode() { throw null; } + public static bool operator ==(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public static implicit operator string (Azure.Core.Serialization.ModelSerializerFormat value) { throw null; } + public static implicit operator Azure.Core.Serialization.ModelSerializerFormat (string value) { throw null; } + public static bool operator !=(Azure.Core.Serialization.ModelSerializerFormat left, Azure.Core.Serialization.ModelSerializerFormat right) { throw null; } + public override string ToString() { throw null; } + } public partial class ModelSerializerOptions { - public ModelSerializerOptions() { } - public bool IgnoreAdditionalProperties { get { throw null; } set { } } - public bool IgnoreReadOnlyProperties { get { throw null; } set { } } + public Azure.Core.Serialization.ModelSerializerFormat Format; + public ModelSerializerOptions(string format = "D") { } public System.Collections.Generic.Dictionary Serializers { get { throw null; } } } public abstract partial class ObjectSerializer diff --git a/sdk/core/Azure.Core/samples/Serialization.md b/sdk/core/Azure.Core/samples/Serialization.md index c6a9c786b538..1a4bfd4909cd 100644 --- a/sdk/core/Azure.Core/samples/Serialization.md +++ b/sdk/core/Azure.Core/samples/Serialization.md @@ -79,7 +79,7 @@ DogListProperty dog = new DogListProperty }; JsonSerializerOptions options = new JsonSerializerOptions(); -options.Converters.Add(new ModelJsonConverter(false)); +options.Converters.Add(new ModelJsonConverter()); string json = System.Text.Json.JsonSerializer.Serialize(dog, options); ``` @@ -90,7 +90,7 @@ string json = System.Text.Json.JsonSerializer.Serialize(dog, options); string json = @"[{""LatinName"":""Animalia"",""Weight"":1.1,""Name"":""Doggo"",""IsHungry"":false,""FoodConsumed"":[""kibble"",""egg"",""peanut butter""],""NumberOfLegs"":4}]"; JsonSerializerOptions options = new JsonSerializerOptions(); -options.Converters.Add(new ModelJsonConverter(false)); +options.Converters.Add(new ModelJsonConverter()); DogListProperty dog = System.Text.Json.JsonSerializer.Deserialize(json, options); ``` diff --git a/sdk/core/Azure.Core/src/Serialization/ModelJsonConverter.cs b/sdk/core/Azure.Core/src/Serialization/ModelJsonConverter.cs index f1635b8e9e63..cb0162dbeba0 100644 --- a/sdk/core/Azure.Core/src/Serialization/ModelJsonConverter.cs +++ b/sdk/core/Azure.Core/src/Serialization/ModelJsonConverter.cs @@ -10,33 +10,27 @@ namespace Azure.Core.Serialization { /// - /// . + /// Add /// #pragma warning disable AZC0014 // Avoid using banned types in public API public class ModelJsonConverter : JsonConverter #pragma warning restore AZC0014 // Avoid using banned types in public API { /// - /// . + /// ModelSerializerFormat that determines Format of serialized model. ModelSerializerFormat.Data = data format which means both properties are false, ModelSerializerFormat.Wire = wire format which means both properties are true Default is ModelSerializerFormat.Data. /// - public bool IgnoreAdditionalProperties { get; set; } = true; + public ModelSerializerFormat Format { get; } /// - /// . + /// String that determines Format of serialized model. "D" = data format which means both properties are false, "W" = wire format which means both properties are true Default is "D". /// - public ModelJsonConverter() { } - - /// - /// . - /// - /// - public ModelJsonConverter(bool ignoreAdditionalProperties) + public ModelJsonConverter(string format = "D") { - IgnoreAdditionalProperties = ignoreAdditionalProperties; + Format = format; } /// - /// . + /// Check if a certain type can be converted to IModelSerializable /// /// /// @@ -46,7 +40,7 @@ public override bool CanConvert(Type typeToConvert) } /// - /// . + /// todo /// /// /// @@ -57,11 +51,11 @@ public override bool CanConvert(Type typeToConvert) public override IModelSerializable Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) #pragma warning restore AZC0014 // Avoid using banned types in public API { - return (IModelSerializable)ModelSerializer.Deserialize(BinaryData.FromString(JsonDocument.ParseValue(ref reader).RootElement.GetRawText()), typeToConvert, ConvertOptions(options)); + return (IModelSerializable)ModelSerializer.Deserialize(BinaryData.FromString(JsonDocument.ParseValue(ref reader).RootElement.GetRawText()), typeToConvert, GetOptions()); } /// - /// . + /// todo /// /// /// @@ -70,7 +64,7 @@ public override IModelSerializable Read(ref Utf8JsonReader reader, Type typeToCo public override void Write(Utf8JsonWriter writer, IModelSerializable value, JsonSerializerOptions options) #pragma warning restore AZC0014 // Avoid using banned types in public API { - BinaryData data = value.Serialize(ConvertOptions(options)); + BinaryData data = value.Serialize(GetOptions()); #if NET6_0_OR_GREATER writer.WriteRawValue(data); #else @@ -78,12 +72,9 @@ public override void Write(Utf8JsonWriter writer, IModelSerializable value, Json #endif } - private ModelSerializerOptions ConvertOptions(JsonSerializerOptions options) + private ModelSerializerOptions GetOptions() { - ModelSerializerOptions serializableOptions = new ModelSerializerOptions(); - serializableOptions.IgnoreAdditionalProperties = IgnoreAdditionalProperties; - serializableOptions.IgnoreReadOnlyProperties = options.IgnoreReadOnlyProperties; - return serializableOptions; + return new ModelSerializerOptions(Format); } } } diff --git a/sdk/core/Azure.Core/src/Serialization/ModelSerializerFormat.cs b/sdk/core/Azure.Core/src/Serialization/ModelSerializerFormat.cs new file mode 100644 index 000000000000..6c24399cab48 --- /dev/null +++ b/sdk/core/Azure.Core/src/Serialization/ModelSerializerFormat.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.ComponentModel; + +namespace Azure.Core.Serialization +{ + /// + /// Enumerator representing format of the serialized model. + /// + public readonly partial struct ModelSerializerFormat : IEquatable + { + internal const string DataValue = "D"; + internal const string WireValue = "W"; + + /// + /// Specifies the data format where IgnoreReadOnly and IgnoreAdditionalProperties are false. + /// + public static readonly ModelSerializerFormat Data = new ModelSerializerFormat(DataValue); + + /// + /// Specifies the wire format IgnoreReadOnly and IgnoreAdditionalProperties are true. + /// + public static readonly ModelSerializerFormat Wire = new ModelSerializerFormat(WireValue); + + private readonly string _value; + + /// + /// Instantiate a new . + /// + public ModelSerializerFormat(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + /// + /// Determines if two values are the same. + /// + /// The first to compare. + /// The second to compare. + /// True if and are the same; otherwise, false. + public static bool operator ==(ModelSerializerFormat left, ModelSerializerFormat right) => left.Equals(right); + + /// + /// Determines if two values are different. + /// + /// The first to compare. + /// The second to compare. + /// True if and are different; otherwise, false. + public static bool operator !=(ModelSerializerFormat left, ModelSerializerFormat right) => !left.Equals(right); + + /// + /// Converts a string to a . + /// + /// The string value to convert. + public static implicit operator ModelSerializerFormat(string value) => new ModelSerializerFormat(value); + + /// + /// Converts a to a string. + /// + /// The ModelSerializerFormat value to convert. + public static implicit operator string(ModelSerializerFormat value) => value.ToString(); + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals([System.Diagnostics.CodeAnalysis.AllowNull] object obj) => obj is ModelSerializerFormat other && Equals(other); + + /// + public bool Equals(ModelSerializerFormat other) => string.Equals(_value, other._value, StringComparison.Ordinal); + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value?.GetHashCode() ?? 0; + + /// + public override string ToString() => _value; + } +} diff --git a/sdk/core/Azure.Core/src/Serialization/ModelSerializerOptions.cs b/sdk/core/Azure.Core/src/Serialization/ModelSerializerOptions.cs index 1b91d4480a9e..d889116800ef 100644 --- a/sdk/core/Azure.Core/src/Serialization/ModelSerializerOptions.cs +++ b/sdk/core/Azure.Core/src/Serialization/ModelSerializerOptions.cs @@ -12,18 +12,32 @@ namespace Azure.Core.Serialization public class ModelSerializerOptions { /// - /// Bool that determines if ReadOnlyProperties will be serialized. Default is false. + /// Initializes a new instance of the class. Takes in a string that determines Format of serialized model. "D" = data format which means IgnoreReadOnly and IgnoreAdditionalProperties are false, "W" = wire format which means both properties are true. Default is "D". /// - public bool IgnoreReadOnlyProperties { get; set; } + /// + public ModelSerializerOptions(string format = "D") + { + //throw ArgumentException if not "D" or "W" + Format = ValidateFormat(format); + } /// - /// Bool that determines if AdditionalProperties will be serialized. Default is false. + /// ModelSerializerFormat that determines Format of serialized model. "D" = data format which means IgnoreReadOnly and IgnoreAdditionalProperties are false, "W" = wire format which means both properties are true. Default is "D". /// - public bool IgnoreAdditionalProperties { get; set; } + public ModelSerializerFormat Format; /// /// Dictionary that holds all the serializers for the different model types. /// public Dictionary Serializers { get; } = new Dictionary(); + + private string ValidateFormat(string x) + { + if (x != ModelSerializerFormat.Data && x != ModelSerializerFormat.Wire) + { + throw new ArgumentException($"Format must be either '{ModelSerializerFormat.Data}' or '{ModelSerializerFormat.Wire}'."); + } + return x; + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/CombinedInterfaceTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/CombinedInterfaceTests.cs index a1ce4169c01f..72abec7227f1 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/CombinedInterfaceTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/CombinedInterfaceTests.cs @@ -13,12 +13,11 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class CombinedInterfaceTests { - [TestCase(true)] - [TestCase(false)] - public void CanRoundTripFutureVersionWithoutLossXml(bool ignoreReadOnlyProperties) + [TestCase("D")] + [TestCase("W")] + public void CanRoundTripFutureVersionWithoutLossXml(string format) { - ModelSerializerOptions options = new ModelSerializerOptions(); - options.IgnoreReadOnlyProperties = ignoreReadOnlyProperties; + ModelSerializerOptions options = new ModelSerializerOptions(format); string serviceResponse = "" + @@ -28,7 +27,7 @@ public void CanRoundTripFutureVersionWithoutLossXml(bool ignoreReadOnlyPropertie ""; var expectedSerializedString = "\uFEFFColorRed"; - if (!ignoreReadOnlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) expectedSerializedString += "ReadOnly"; expectedSerializedString += ""; @@ -43,26 +42,23 @@ public void CanRoundTripFutureVersionWithoutLossXml(bool ignoreReadOnlyPropertie Assert.That(roundTrip, Is.EqualTo(expectedSerializedString)); XmlModelForCombinedInterface model2 = ModelSerializer.Deserialize(new BinaryData(Encoding.UTF8.GetBytes(roundTrip)), options); - VerifyModelXmlModelForCombinedInterface(model, model2, ignoreReadOnlyProperties); + VerifyModelXmlModelForCombinedInterface(model, model2, format); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void CanRoundTripFutureVersionWithoutLossJson(bool ignoreReadOnlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void CanRoundTripFutureVersionWithoutLossJson(string format) { - ModelSerializerOptions options = new ModelSerializerOptions(); - options.IgnoreAdditionalProperties = ignoreAdditionalProperties; - options.IgnoreReadOnlyProperties = ignoreReadOnlyProperties; + ModelSerializerOptions options = new ModelSerializerOptions(format); string serviceResponse = "{\"key\":\"Color\",\"value\":\"Red\",\"readOnlyProperty\":\"ReadOnly\",\"x\":\"extra\"}"; var expectedSerializedString = "{\"key\":\"Color\",\"value\":\"Red\""; - if (!ignoreReadOnlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) + { expectedSerializedString += ",\"readOnlyProperty\":\"ReadOnly\""; - if (!ignoreAdditionalProperties) expectedSerializedString += ",\"x\":\"extra\""; + } expectedSerializedString += "}"; JsonModelForCombinedInterface model = ModelSerializer.Deserialize(new BinaryData(Encoding.UTF8.GetBytes(serviceResponse)), options); @@ -72,35 +68,35 @@ public void CanRoundTripFutureVersionWithoutLossJson(bool ignoreReadOnlyProperti Assert.AreEqual("ReadOnly", model.ReadOnlyProperty); var additionalProperties = typeof(JsonModelForCombinedInterface).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(model) as Dictionary; Assert.IsNotNull(additionalProperties); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("x")); + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("x")); var data = ModelSerializer.Serialize(model, options); string roundTrip = data.ToString(); Assert.That(roundTrip, Is.EqualTo(expectedSerializedString)); JsonModelForCombinedInterface model2 = ModelSerializer.Deserialize(new BinaryData(Encoding.UTF8.GetBytes(roundTrip)), options); - VerifyModelJsonModelForCombinedInterface(model, model2, ignoreReadOnlyProperties, ignoreAdditionalProperties); + VerifyModelJsonModelForCombinedInterface(model, model2, format); } - internal static void VerifyModelXmlModelForCombinedInterface(XmlModelForCombinedInterface expected, XmlModelForCombinedInterface actual, bool ignoreReadOnlyProperties) + internal static void VerifyModelXmlModelForCombinedInterface(XmlModelForCombinedInterface expected, XmlModelForCombinedInterface actual, string format) { Assert.AreEqual(expected.Key, actual.Key); Assert.AreEqual(expected.Value, actual.Value); - if (!ignoreReadOnlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual(expected.ReadOnlyProperty, actual.ReadOnlyProperty); } - internal static void VerifyModelJsonModelForCombinedInterface(JsonModelForCombinedInterface expected, JsonModelForCombinedInterface actual, bool ignoreReadOnlyProperties, bool ignoreAdditionalProperties) + internal static void VerifyModelJsonModelForCombinedInterface(JsonModelForCombinedInterface expected, JsonModelForCombinedInterface actual, string format) { Assert.AreEqual(expected.Key, actual.Key); Assert.AreEqual(expected.Value, actual.Value); - if (!ignoreReadOnlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual(expected.ReadOnlyProperty, actual.ReadOnlyProperty); var rawDataProperty = typeof(JsonModelForCombinedInterface).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var expectedRawData = rawDataProperty.GetValue(expected) as Dictionary; var actualRawData = rawDataProperty.GetValue(actual) as Dictionary; Assert.AreEqual(expectedRawData.Count, actualRawData.Count); - if (!ignoreAdditionalProperties) + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual(expectedRawData["x"].ToString(), actualRawData["x"].ToString()); } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Envelope.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Envelope.cs index 4ad575cb800a..b9cb8daf3a94 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Envelope.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Envelope.cs @@ -54,7 +54,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) MemoryStream stream = new MemoryStream(); Utf8JsonWriter writer = new Utf8JsonWriter(stream); writer.WriteStartObject(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("readOnlyProperty"u8); writer.WriteStringValue(ReadOnlyProperty); @@ -70,7 +70,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("modelC"u8); SerializeT(writer, options); - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -114,7 +114,7 @@ internal static Envelope DeserializeEnvelope(JsonElement element, ModelSerial continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means it's an modelC property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/EnvelopeTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/EnvelopeTests.cs index 6177ea12de69..108c63d41e29 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/EnvelopeTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/EnvelopeTests.cs @@ -12,12 +12,9 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class EnvelopeTests { - private readonly ModelSerializerOptions _wireOptions = new ModelSerializerOptions { IgnoreReadOnlyProperties = false }; - private readonly ModelSerializerOptions _objectOptions = new ModelSerializerOptions(); - - [TestCase(true)] - [TestCase(false)] - public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) + [TestCase("D")] + [TestCase("W")] + public void CanRoundTripFutureVersionWithoutLoss(string format) { string serviceResponse = "{\"readOnlyProperty\":\"read\"," + @@ -26,12 +23,12 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) "}"; StringBuilder expectedSerialized = new StringBuilder("{"); - if (!ignoreReadOnly) + if (format.Equals(ModelSerializerFormat.Data)) { expectedSerialized.Append("\"readOnlyProperty\":\"read\","); } expectedSerialized.Append("\"modelA\":{"); - if (!ignoreReadOnly) + if (format.Equals(ModelSerializerFormat.Data)) { expectedSerialized.Append("\"latinName\":\"Felis catus\",\"hasWhiskers\":false,"); } @@ -40,9 +37,9 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) expectedSerialized.Append("}"); var expectedSerializedString = expectedSerialized.ToString(); - ModelSerializerOptions options = new ModelSerializerOptions() { IgnoreReadOnlyProperties = ignoreReadOnly }; + ModelSerializerOptions options = new ModelSerializerOptions(format); - if (ignoreReadOnly) + if (format == ModelSerializerFormat.Wire) { JsonSerializerSettings settings = new JsonSerializerSettings { @@ -55,7 +52,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) Envelope model = ModelSerializer.Deserialize>(new BinaryData(Encoding.UTF8.GetBytes(serviceResponse)), options: options); - if (!ignoreReadOnly) + if (format.Equals(ModelSerializerFormat.Data)) { Assert.That(model.ReadOnlyProperty, Is.EqualTo("read")); } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs index 0652fd9b829f..d970dad4be02 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs @@ -15,18 +15,15 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { public class ModelJsonConverterTests { - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void SerializeTest(bool ignoreReadonlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void SerializeTest(string format) { JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter()); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperties; + options.Converters.Add(new ModelJsonConverter(format)); string expected = "{"; - if (!ignoreReadonlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) expected += "\"latinName\":\"Animalia\","; expected += "\"name\":\"Doggo\",\"isHungry\":false,"; expected += "\"weight\":1.5,"; @@ -42,17 +39,14 @@ public void SerializeTest(bool ignoreReadonlyProperties, bool ignoreAdditionalPr Assert.AreEqual(expected, actual); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void DeserializeTest(bool ignoreReadonlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void DeserializeTest(string format) { string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.5,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"],\"numberOfLegs\":4}"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(ignoreAdditionalProperties)); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperties; + options.Converters.Add(new ModelJsonConverter(format)); var dog = JsonSerializer.Deserialize(serviceResponse, options); @@ -64,17 +58,17 @@ public void DeserializeTest(bool ignoreReadonlyProperties, bool ignoreAdditional var additionalProperties = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(dog) as Dictionary; Assert.IsNotNull(additionalProperties); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("numberOfLegs")); - if (!ignoreAdditionalProperties) + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("numberOfLegs")); + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual("4", additionalProperties["numberOfLegs"].ToString()); string expected = "{"; - if (!ignoreReadonlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) expected += "\"latinName\":\"Animalia\","; expected += "\"name\":\"Doggo\",\"isHungry\":false,"; expected += "\"weight\":1.5,"; expected += "\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]"; - if (!ignoreAdditionalProperties) + if (format.Equals(ModelSerializerFormat.Data)) { expected += ",\"numberOfLegs\":4,\"DogListPropertyConverterMarker\":true"; //validate marker exists to ensure we are using the class converter if it exists } @@ -90,7 +84,7 @@ public void UsesMoreConcreteConverter() string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.5,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"],\"numberOfLegs\":4}"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(false)); + options.Converters.Add(new ModelJsonConverter()); options.Converters.Add(new DogListPropertyBlankConverter()); //the more concrete converter should be used so we will validate the default values are used @@ -105,17 +99,14 @@ public void UsesMoreConcreteConverter() Assert.AreEqual("", actual); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void CanSerializeDerivedModel(bool ignoreReadonlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void CanSerializeDerivedModel(string format) { string serviceResponse = "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperties; - options.Converters.Add(new ModelJsonConverter(ignoreAdditionalProperties)); + options.Converters.Add(new ModelJsonConverter(format)); var modelX = JsonSerializer.Deserialize(serviceResponse, options); Assert.AreEqual("xmodel", modelX.Name); @@ -123,31 +114,28 @@ public void CanSerializeDerivedModel(bool ignoreReadonlyProperties, bool ignoreA Assert.AreEqual("X", modelX.Kind); var additionalProperties = typeof(ModelX).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelX) as Dictionary; Assert.IsNotNull(additionalProperties); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("extra")); - if (!ignoreAdditionalProperties) + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("extra")); + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); string expected = "{\"kind\":\"X\",\"name\":\"xmodel\""; - if (!ignoreReadonlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) expected += ",\"xProperty\":100"; - if (!ignoreAdditionalProperties) + if (format.Equals(ModelSerializerFormat.Data)) expected += ",\"extra\":\"stuff\""; expected += "}"; var actual = JsonSerializer.Serialize(modelX, options); Assert.AreEqual(expected, actual); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void CanSerializeBaseModel(bool ignoreReadonlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void CanSerializeBaseModel(string format) { string serviceResponse = "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperties; - options.Converters.Add(new ModelJsonConverter(ignoreAdditionalProperties)); + options.Converters.Add(new ModelJsonConverter(format)); var baseModel = JsonSerializer.Deserialize(serviceResponse, options); var modelX = baseModel as ModelX; @@ -157,31 +145,29 @@ public void CanSerializeBaseModel(bool ignoreReadonlyProperties, bool ignoreAddi Assert.AreEqual("X", modelX.Kind); var additionalProperties = typeof(ModelX).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelX) as Dictionary; Assert.IsNotNull(additionalProperties); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("extra")); - if (!ignoreAdditionalProperties) + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("extra")); + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); string expected = "{\"kind\":\"X\",\"name\":\"xmodel\""; - if (!ignoreReadonlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) + { expected += ",\"xProperty\":100"; - if (!ignoreAdditionalProperties) expected += ",\"extra\":\"stuff\""; + } expected += "}"; var actual = JsonSerializer.Serialize(baseModel, options); Assert.AreEqual(expected, actual); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void CanSerializeUnknown(bool ignoreReadonlyProperties, bool ignoreAdditionalProperties) + [TestCase("D")] + [TestCase("W")] + public void CanSerializeUnknown(string format) { string serviceResponse = "{\"kind\":\"Z\",\"name\":\"zmodel\",\"zProperty\":1.5,\"extra\":\"stuff\"}"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperties; - options.Converters.Add(new ModelJsonConverter(ignoreAdditionalProperties)); + options.Converters.Add(new ModelJsonConverter(format)); var baseModel = JsonSerializer.Deserialize(serviceResponse, options); var unknownBaseModel = baseModel as UnknownBaseModel; @@ -190,16 +176,16 @@ public void CanSerializeUnknown(bool ignoreReadonlyProperties, bool ignoreAdditi Assert.AreEqual("Z", baseModel.Kind); var additionalProperties = typeof(UnknownBaseModel).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(baseModel) as Dictionary; Assert.IsNotNull(additionalProperties); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("extra")); - Assert.AreEqual(!ignoreAdditionalProperties, additionalProperties.ContainsKey("zProperty")); - if (!ignoreAdditionalProperties) + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("extra")); + Assert.AreEqual(format.Equals(ModelSerializerFormat.Data), additionalProperties.ContainsKey("zProperty")); + if (format.Equals(ModelSerializerFormat.Data)) { Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); Assert.AreEqual("1.5", additionalProperties["zProperty"].ToString()); } string expected = "{\"kind\":\"Z\",\"name\":\"zmodel\""; - if (!ignoreAdditionalProperties) + if (format.Equals(ModelSerializerFormat.Data)) { expected += ",\"zProperty\":1.5"; expected += ",\"extra\":\"stuff\""; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs index eaa0e9630d17..defae519f81d 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs @@ -12,12 +12,11 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class ModelXmlTests { - [TestCase(true)] - [TestCase(false)] - public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadonlyProperites) + [TestCase("D")] + [TestCase("W")] + public void CanRoundTripFutureVersionWithoutLoss(string format) { - ModelSerializerOptions options = new ModelSerializerOptions(); - options.IgnoreReadOnlyProperties = ignoreReadonlyProperites; + ModelSerializerOptions options = new ModelSerializerOptions(format); Stream stream = new MemoryStream(); @@ -29,7 +28,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadonlyProperites) ""; var expectedSerializedString = "\uFEFFColorRed"; - if (!ignoreReadonlyProperites) + if (format.Equals(ModelSerializerFormat.Data)) expectedSerializedString += "ReadOnly"; expectedSerializedString += ""; @@ -44,14 +43,14 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadonlyProperites) Assert.That(roundTrip, Is.EqualTo(expectedSerializedString)); ModelXml model2 = ModelSerializer.Deserialize(new BinaryData(Encoding.UTF8.GetBytes(roundTrip)), options); - VerifyModelXml(model, model2, ignoreReadonlyProperites); + VerifyModelXml(model, model2, format); } - internal static void VerifyModelXml(ModelXml correctModelXml, ModelXml model2, bool ignoreReadOnlyProperties) + internal static void VerifyModelXml(ModelXml correctModelXml, ModelXml model2, string format) { Assert.AreEqual(correctModelXml.Key, model2.Key); Assert.AreEqual(correctModelXml.Value, model2.Value); - if (!ignoreReadOnlyProperties) + if (format.Equals(ModelSerializerFormat.Data)) Assert.AreEqual(correctModelXml.ReadOnlyProperty, model2.ReadOnlyProperty); } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs index 0d652be91304..04fb0857503f 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs @@ -61,7 +61,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) MemoryStream stream = new MemoryStream(); Utf8JsonWriter writer = new Utf8JsonWriter(stream); writer.WriteStartObject(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); @@ -73,7 +73,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("weight"u8); writer.WriteNumberValue(Weight); - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -123,7 +123,7 @@ internal static Animal DeserializeAnimal(JsonElement element, ModelSerializerOpt continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means it's an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs index add2d3a38e5a..a563741350a3 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs @@ -45,7 +45,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) MemoryStream stream = new MemoryStream(); Utf8JsonWriter writer = new Utf8JsonWriter(stream); writer.WriteStartObject(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); @@ -60,7 +60,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("weight"u8); writer.WriteNumberValue(Weight); - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -116,7 +116,7 @@ internal static CatReadOnlyProperty DeserializeCatReadOnlyProperty(JsonElement e hasWhiskers = property.Value.GetBoolean(); continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means its an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs index 765f9f401619..0ec407bc48e9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs @@ -41,7 +41,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("name"u8); writer.WriteStringValue(Name); } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs index be97f3bf6525..4188b925bc64 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs @@ -53,12 +53,12 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("name"u8); writer.WriteStringValue(Name); } - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("xProperty"u8); writer.WriteNumberValue(XProperty); } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -104,7 +104,7 @@ internal static ModelX DeserializeModelX(JsonElement element, ModelSerializerOpt xProperty = property.Value.GetInt32(); continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means it's an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs index c3e25259e64c..c4c4bdd9cf2c 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs @@ -49,7 +49,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WriteStartObject(); writer.WritePropertyName("kind"u8); writer.WriteStringValue(Kind); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { if (Optional.IsDefined(Name)) { @@ -59,7 +59,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) } writer.WritePropertyName("yProperty"u8); writer.WriteStringValue(YProperty); - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -105,7 +105,7 @@ internal static ModelY DeserializeModelY(JsonElement element, ModelSerializerOpt yProperty = property.Value.GetString(); continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means it's an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs index 4626f9bfa321..b75dccf2996d 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs @@ -51,7 +51,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WritePropertyName("name"u8); writer.WriteStringValue(Name); } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -91,7 +91,7 @@ internal static UnknownBaseModel DeserializeUnknownBaseModel(JsonElement element name = property.Value.GetString(); continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means it's an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs index 0ce13560d93f..7e861b921763 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs @@ -37,11 +37,7 @@ public DogListProperty() public static explicit operator DogListProperty(Response response) { using JsonDocument jsonDocument = JsonDocument.Parse(response.ContentStream); - var serializationOptions = new ModelSerializerOptions() - { - IgnoreReadOnlyProperties = false, - IgnoreAdditionalProperties = false - }; + var serializationOptions = new ModelSerializerOptions(ModelSerializerFormat.Data); return DeserializeDogListProperty(jsonDocument.RootElement, serializationOptions); } @@ -70,7 +66,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) MemoryStream stream = new MemoryStream(); Utf8JsonWriter writer = new Utf8JsonWriter(stream); writer.WriteStartObject(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("latinName"u8); writer.WriteStringValue(LatinName); @@ -93,7 +89,7 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WriteEndArray(); } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) @@ -151,7 +147,7 @@ internal static DogListProperty DeserializeDogListProperty(JsonElement element, } continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means its an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); @@ -165,7 +161,7 @@ internal class DogListPropertyConverter : JsonConverter { public override DogListProperty Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var model = DeserializeDogListProperty(JsonDocument.ParseValue(ref reader).RootElement, ConvertOptions(options)); + var model = DeserializeDogListProperty(JsonDocument.ParseValue(ref reader).RootElement, GetOptions(options)); //marker used for testing to know if this converter fires model.RawData.Add("DogListPropertyConverterMarker", new BinaryData("true")); return model; @@ -173,7 +169,7 @@ public override DogListProperty Read(ref Utf8JsonReader reader, Type typeToConve public override void Write(Utf8JsonWriter writer, DogListProperty value, JsonSerializerOptions options) { - BinaryData data = ((IModelSerializable)value).Serialize(ConvertOptions(options)); + BinaryData data = ((IModelSerializable)value).Serialize(GetOptions(options)); #if NET6_0_OR_GREATER writer.WriteRawValue(data); #else @@ -181,15 +177,14 @@ public override void Write(Utf8JsonWriter writer, DogListProperty value, JsonSer #endif } - private ModelSerializerOptions ConvertOptions(JsonSerializerOptions options) + private ModelSerializerOptions GetOptions(JsonSerializerOptions options) { var serializableOptions = new ModelSerializerOptions(); //pulls the additional properties setting from the ModelJsonConverter if it exists //if it does not exist it uses the default value of true for azure sdk use cases - var modelConverter = options.Converters.FirstOrDefault(c=>c.GetType() == typeof(ModelJsonConverter)) as ModelJsonConverter; - serializableOptions.IgnoreAdditionalProperties = modelConverter is not null ? modelConverter.IgnoreAdditionalProperties : true; - serializableOptions.IgnoreReadOnlyProperties = options.IgnoreReadOnlyProperties; - return serializableOptions; + var modelConverter = options.Converters.FirstOrDefault(c => c.GetType() == typeof(ModelJsonConverter)) as ModelJsonConverter; + string format = modelConverter is not null ? modelConverter.Format : ModelSerializerFormat.Wire; + return new ModelSerializerOptions(format); } } object IModelSerializable.Deserialize(BinaryData data, ModelSerializerOptions options) diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs index e1920998d3ba..7ffd62a6418a 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs @@ -79,7 +79,7 @@ internal static JsonModelForCombinedInterface DeserializeJsonModelForCombinedInt readOnlyProperty = property.Value.GetString(); continue; } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //this means its an unknown property we got rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); @@ -97,12 +97,12 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) writer.WriteStringValue(Key); writer.WritePropertyName("value"u8); writer.WriteStringValue(Value); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WritePropertyName("readOnlyProperty"u8); writer.WriteStringValue(ReadOnlyProperty); } - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { //write out the raw data foreach (var property in RawData) diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs index 9b0f365e805f..42c483e8ecfe 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs @@ -46,13 +46,14 @@ public ModelXml(string key, string value, string readonlyProperty) private void Serialize(XmlWriter writer, ModelSerializerOptions options) { + writer.WriteStartElement("Tag"); writer.WriteStartElement("Key"); writer.WriteValue(Key); writer.WriteEndElement(); writer.WriteStartElement("Value"); writer.WriteValue(Value); writer.WriteEndElement(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WriteStartElement("ReadOnlyProperty"); writer.WriteValue(ReadOnlyProperty); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs index ae8c2c933725..7274f2d186e9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs @@ -65,13 +65,14 @@ internal static XmlModelForCombinedInterface DeserializeXmlModelForCombinedInter private void Serialize(XmlWriter writer, ModelSerializerOptions options) { + writer.WriteStartElement("Tag"); writer.WriteStartElement("Key"); writer.WriteValue(Key); writer.WriteEndElement(); writer.WriteStartElement("Value"); writer.WriteValue(Value); writer.WriteEndElement(); - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) { writer.WriteStartElement("ReadOnlyProperty"); writer.WriteValue(ReadOnlyProperty); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/NewtonSoftTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/NewtonSoftTests.cs index fda65f1821bd..02afbc488eb3 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/NewtonSoftTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/NewtonSoftTests.cs @@ -15,12 +15,9 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class NewtonSoftTests { - private readonly ModelSerializerOptions _wireOptions = new ModelSerializerOptions { IgnoreReadOnlyProperties = false }; - private readonly ModelSerializerOptions _objectOptions = new ModelSerializerOptions(); - - [TestCase(true)] - [TestCase(false)] - public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) + [TestCase("D")] + [TestCase("W")] + public void CanRoundTripFutureVersionWithoutLoss(string format) { Stream stream = new MemoryStream(); string serviceResponse = @@ -29,7 +26,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) StringBuilder expectedSerialized = new StringBuilder("{"); expectedSerialized.Append("\"IsHungry\":false,"); expectedSerialized.Append("\"Weight\":2.5,"); - if (!ignoreReadOnly) + if (format.Equals(ModelSerializerFormat.Data)) { expectedSerialized.Append("\"LatinName\":\"Animalia\","); } @@ -37,9 +34,9 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) expectedSerialized.Append("}"); var expectedSerializedString = expectedSerialized.ToString(); - ModelSerializerOptions options = new ModelSerializerOptions() { IgnoreReadOnlyProperties = ignoreReadOnly }; + ModelSerializerOptions options = new ModelSerializerOptions(format); - if (ignoreReadOnly) + if (format == ModelSerializerFormat.Wire) { JsonSerializerSettings settings = new JsonSerializerSettings { @@ -52,7 +49,7 @@ public void CanRoundTripFutureVersionWithoutLoss(bool ignoreReadOnly) var model = ModelSerializer.Deserialize(new BinaryData(Encoding.UTF8.GetBytes(serviceResponse)), options: options); - if (!ignoreReadOnly) + if (format.Equals(ModelSerializerFormat.Data)) { Assert.That(model.LatinName, Is.EqualTo("Animalia")); } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs index 63598eed828b..1d467be90a45 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs @@ -15,8 +15,6 @@ public class UsingJsonSerializerTests public void SerializeTest(bool ignoreReadonlyProperties) { string expected = "{"; - if (!ignoreReadonlyProperties) - expected += "\"latinName\":\"Animalia\","; expected += "\"name\":\"Doggo\",\"isHungry\":false,"; #if NETFRAMEWORK expected += "\"weight\":1.1000000000000001,"; @@ -62,8 +60,6 @@ public void DeserializeTest(bool ignoreReadonlyProperties) Assert.IsFalse(additionalProperties.ContainsKey("numberOfLegs")); string expected = "{"; - if (!ignoreReadonlyProperties) - expected += "\"latinName\":\"Animalia\","; expected += "\"name\":\"Doggo\",\"isHungry\":false,"; #if NETFRAMEWORK expected += "\"weight\":1.1000000000000001,"; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/VerifyModels.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/VerifyModels.cs index 709790e6fc8a..9f6d3e033474 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/VerifyModels.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/VerifyModels.cs @@ -17,12 +17,12 @@ public static void CheckAnimals(Animal x, Animal y, ModelSerializerOptions optio private static void VerifyProperties(Animal x, Animal y, ModelSerializerOptions options) { - if (!options.IgnoreReadOnlyProperties) + if (options.Format == ModelSerializerFormat.Data) Assert.That(x.LatinName, Is.EqualTo(y.LatinName)); Assert.That(x.Name, Is.EqualTo(y.Name)); Assert.That(x.Weight, Is.EqualTo(y.Weight)); - if (!options.IgnoreAdditionalProperties) + if (options.Format == ModelSerializerFormat.Data) { var additionalPropertiesX = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(x) as Dictionary; var additionalPropertiesY = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(y) as Dictionary; diff --git a/sdk/core/Azure.Core/tests/public/Samples/SerializationSamples.cs b/sdk/core/Azure.Core/tests/public/Samples/SerializationSamples.cs index 9cdd6e3aa2e5..5a8488d3a7e8 100644 --- a/sdk/core/Azure.Core/tests/public/Samples/SerializationSamples.cs +++ b/sdk/core/Azure.Core/tests/public/Samples/SerializationSamples.cs @@ -87,7 +87,7 @@ public void ModelConverterSerialize() }; JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(false)); + options.Converters.Add(new ModelJsonConverter()); string json = System.Text.Json.JsonSerializer.Serialize(dog, options); #endregion @@ -101,7 +101,7 @@ public void ModelConverterDeserialize() string json = @"[{""LatinName"":""Animalia"",""Weight"":1.1,""Name"":""Doggo"",""IsHungry"":false,""FoodConsumed"":[""kibble"",""egg"",""peanut butter""],""NumberOfLegs"":4}]"; JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(false)); + options.Converters.Add(new ModelJsonConverter()); DogListProperty dog = System.Text.Json.JsonSerializer.Deserialize(json, options); #endregion