diff --git a/src/AutoRest.CSharp/Common/Output/Builders/JsonSerializationMethodsBuilder.cs b/src/AutoRest.CSharp/Common/Output/Builders/JsonSerializationMethodsBuilder.cs index f41b22b53c1..256f2a99d10 100644 --- a/src/AutoRest.CSharp/Common/Output/Builders/JsonSerializationMethodsBuilder.cs +++ b/src/AutoRest.CSharp/Common/Output/Builders/JsonSerializationMethodsBuilder.cs @@ -440,16 +440,11 @@ private static MethodBodyStatement SerializeValue(Utf8JsonWriterExpression utf8J switch (valueSerialization.Type.Implementation) { case SystemObjectType systemObjectType when IsCustomJsonConverterAdded(systemObjectType.SystemType): - if (valueSerialization.Options == JsonSerializationOptions.UseManagedServiceIdentityV3) - { - return new[] - { - Var("serializeOptions", New.JsonSerializerOptions(), out var serializeOptions), - JsonSerializerExpression.Serialize(utf8JsonWriter, value, serializeOptions).ToStatement() - }; - } - - return JsonSerializerExpression.Serialize(utf8JsonWriter, value).ToStatement(); + var jsonModelInterface = new CSharpType(typeof(IJsonModel<>), systemObjectType.Type); + var cast = value.CastTo(jsonModelInterface); + // ((IJsonModel)Value).Write(writer, options) + options ??= ModelReaderWriterOptionsExpression.Wire; + return cast.Invoke(nameof(IJsonModel.Write), utf8JsonWriter, options).ToStatement(); case ObjectType: return utf8JsonWriter.WriteObjectValue(value, options: options); @@ -567,7 +562,11 @@ private static MethodBodyStatement SerializeFrameworkTypeValue(Utf8JsonWriterExp if (IsCustomJsonConverterAdded(valueType)) { - return JsonSerializerExpression.Serialize(utf8JsonWriter, value).ToStatement(); + var jsonModelInterface = new CSharpType(typeof(IJsonModel<>), valueType); + var cast = value.CastTo(jsonModelInterface); + // ((IJsonModel)Value).Write(writer) + options ??= ModelReaderWriterOptionsExpression.Wire; + return cast.Invoke(nameof(IJsonModel.Write), utf8JsonWriter, options).ToStatement(); } throw new NotSupportedException($"Framework type {valueType} serialization not supported, please add `CodeGenMemberSerializationHooks` to specify the serialization of this type with the customized property"); diff --git a/src/AutoRest.CSharp/Common/Output/Expressions/KnownValueExpressions/JsonModelExpression.cs b/src/AutoRest.CSharp/Common/Output/Expressions/KnownValueExpressions/JsonModelExpression.cs new file mode 100644 index 00000000000..4f912722dc0 --- /dev/null +++ b/src/AutoRest.CSharp/Common/Output/Expressions/KnownValueExpressions/JsonModelExpression.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using AutoRest.CSharp.Common.Output.Expressions.ValueExpressions; + +namespace AutoRest.CSharp.Common.Output.Expressions.KnownValueExpressions +{ + internal static class JsonModelExpression + { + public static InvokeInstanceMethodExpression Write(ValueExpression writer, ValueExpression value, ValueExpression? options = null) + { + var arguments = options is null + ? new[] { writer, } + : new[] { writer, options }; + return new InvokeInstanceMethodExpression(value, "Write", arguments, callAsAsync: false); + } + } +}