Skip to content

Commit 7664da7

Browse files
authored
Generate serialization AOT-compatible (Azure#51628)
* make serialization AOT compatible * Generate serialization AOT-compatible
1 parent f6fcd8e commit 7664da7

File tree

9 files changed

+59
-16
lines changed

9 files changed

+59
-16
lines changed

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/ManagementTypeFactory.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
using Azure.Generator.Management.Primitives;
66
using Azure.Generator.Management.Providers;
77
using Azure.Generator.Management.Providers.Abstraction;
8+
using Azure.Generator.Management.Snippets;
89
using Microsoft.TypeSpec.Generator;
910
using Microsoft.TypeSpec.Generator.ClientModel.Providers;
11+
using Microsoft.TypeSpec.Generator.ClientModel.Snippets;
1012
using Microsoft.TypeSpec.Generator.Expressions;
1113
using Microsoft.TypeSpec.Generator.Input;
1214
using Microsoft.TypeSpec.Generator.Input.Extensions;
@@ -17,6 +19,7 @@
1719
using System;
1820
using System.ClientModel.Primitives;
1921
using System.Collections.Generic;
22+
using System.Text;
2023
using System.Text.Json;
2124
using static Microsoft.TypeSpec.Generator.Snippets.Snippet;
2225

@@ -99,7 +102,7 @@ public override MethodBodyStatement SerializeJsonValue(Type valueType, ValueExpr
99102
{
100103
if (KnownManagementTypes.IsKnownManagementType(valueType))
101104
{
102-
return Static(typeof(JsonSerializer)).Invoke(nameof(JsonSerializer.Serialize), [value]).Terminate();
105+
return value.CastTo(new CSharpType(typeof(IJsonModel<>), valueType)).Invoke(nameof(IJsonModel<object>.Write), [ModelSerializationExtensionsSnippets.Wire]).Terminate();
103106
}
104107

105108
if (KnownManagementTypes.TryGetJsonSerializationExpression(valueType, out var serializationExpression))
@@ -117,7 +120,23 @@ public override ValueExpression DeserializeJsonValue(Type valueType, ScopedApi<J
117120
{
118121
if (KnownManagementTypes.IsKnownManagementType(valueType))
119122
{
120-
return Static(typeof(JsonSerializer)).Invoke(nameof(JsonSerializer.Deserialize), [element], [valueType], false);
123+
IReadOnlyList<ValueExpression> readBody =
124+
[
125+
New.Instance(
126+
typeof(BinaryData),
127+
[
128+
new MemberExpression(typeof(Encoding), nameof(Encoding.UTF8)).Invoke(nameof(UTF8Encoding.GetBytes),
129+
[
130+
element.GetRawText()
131+
])
132+
]),
133+
ModelSerializationExtensionsSnippets.Wire
134+
];
135+
136+
return Static(typeof(ModelReaderWriter)).Invoke(
137+
nameof(ModelReaderWriter.Read),
138+
[.. readBody, ModelReaderWriterContextSnippets.Default],
139+
typeArgs: [valueType]);
121140
}
122141

123142
if (KnownManagementTypes.TryGetJsonDeserializationExpression(valueType, out var deserializationExpression))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using Microsoft.TypeSpec.Generator.ClientModel.Providers;
5+
using Microsoft.TypeSpec.Generator.Snippets;
6+
using System.ClientModel.Primitives;
7+
using static Microsoft.TypeSpec.Generator.Snippets.Snippet;
8+
9+
namespace Azure.Generator.Management.Snippets
10+
{
11+
internal static class ModelSerializationExtensionsSnippets
12+
{
13+
private const string WireOptionsName = "WireOptions";
14+
15+
public static readonly ScopedApi<ModelReaderWriterOptions> Wire = Static<ModelSerializationExtensionsDefinition>().Property(WireOptionsName).As<ModelReaderWriterOptions>();
16+
}
17+
}

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/BarData.Serialization.cs

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/BarSettingsData.Serialization.cs

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/FooData.Serialization.cs

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/FooSettingsData.Serialization.cs

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/Models/PrivateLink.Serialization.cs

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/Models/ZooAddressListListResult.Serialization.cs

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/ZooData.Serialization.cs

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)