Skip to content

Commit 03aebb4

Browse files
authored
Enhance ModelReaderWriter with collection support (Azure#48102)
* Enhance ModelReaderWriter with collection support Updated ModelReaderWriter.cs to improve reading and writing functionality for various collection types, including List<> and Dictionary<>. Added error handling for unsupported types and enhanced exception messages. Updated ModelReaderWriterTests.cs with new test cases to validate the changes, covering edge cases and empty collections. Added JSON test data for comprehensive testing of availability set data. Included a new package reference for System.Memory.Data in project files. Minor corrections made to comments and variable names for clarity. * expand test coverage * update api * update dotnet in ci * add aot annotations * more aot annotation * Update to keep current behavior but add new read methods which are AOT compatible for IEnumerable and IPersistableModel * fix aot on collection reader * update to remove collection read type restriction * update context pattern * drop internal interface * add ROM support * add immutablelist test example * add more test cases * code clean up * add coverage for context and non context into modeltests * refactor collection tests to use common base * update api * move list of list tests to inherit test base * update remaining tests * more test coverage * add remaining immutable and readonly tests * add perf tests to verify no regression and context path is faster * fix net framework test diff * add polymorphic collection tests * comment out problematic tests * pr fb * pr feedback to remove CollectionBuilder as a public class * more api feedback * fix param name * drop property funcs * drop assert key * drop asserts and createelementinstance * add support and test cases for null entries in the collections add tests for custom collection * add support and tests for non generic collection and non string keys * Fill out coverage after refactors * update method names to match new renames * added test cases for mixed model and enumerable
1 parent 7d8845d commit 03aebb4

File tree

129 files changed

+7956
-353
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+7956
-353
lines changed

eng/ApiListing.exclude-attributes.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute
12
T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute
23
T:System.Runtime.CompilerServices.AsyncStateMachineAttribute
34
T:System.Runtime.CompilerServices.CompilerGeneratedAttribute

eng/scripts/compatibility/Check-AOT-Compatibility.ps1

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ $publishOutput = dotnet publish aotcompatibility.csproj -nodeReuse:false /p:UseS
6363

6464
if ($LASTEXITCODE -ne 0)
6565
{
66-
Write-Host "Publish failed."
66+
Write-Host "Publish failed." -ForegroundColor Red
6767

68-
Write-Host $publishOutput
68+
Write-Host ($publishOutput -join "`n")
6969

7070
Write-Host "Deleting test app files."
7171

@@ -104,9 +104,9 @@ if (Test-Path $expectedWarningsFullPath -PathType Leaf) {
104104
$numWarnings = $warnings.Count
105105

106106
if ($numWarnings -gt 0) {
107-
Write-Host "Found $numWarnings additional warnings that were not expected:"
107+
Write-Host "Found $numWarnings additional warnings that were not expected:" -ForegroundColor Red
108108
foreach ($warning in $warnings) {
109-
Write-Host $warning
109+
Write-Host $warning -ForegroundColor Yellow
110110
}
111111
}
112112

@@ -129,9 +129,9 @@ Write-Host "Checking against the list of expected warnings. There are $numExpect
129129
$warnings = $publishOutput -split "`n" | select-string -pattern 'IL\d+' | select-string -pattern '##' -notmatch | select-string -pattern $expectedWarnings -notmatch
130130
$numWarnings = $warnings.Count
131131
if ($numWarnings -gt 0) {
132-
Write-Host "Found $numWarnings additional warnings that were not expected:"
132+
Write-Host "Found $numWarnings additional warnings that were not expected:" -ForegroundColor Red
133133
foreach ($warning in $warnings) {
134-
Write-Host $warning
134+
Write-Host $warning -ForegroundColor Yellow
135135
}
136136
}
137137

sdk/ai/Azure.AI.Projects/tests/AgentClientTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ public enum VecrorStoreTestType
4949
#endregion
5050

5151
[RecordedTest]
52-
[TestCase(ArgumentType.Metadata)]
53-
[TestCase(ArgumentType.Bytes)]
52+
//Failing in CI due to no playback found
53+
//https://dev.azure.com/azure-sdk/public/_build/results?buildId=4622315&view=logs&j=91fc166b-5adf-5829-8c48-947d370143f5&t=b0549744-0856-5f62-f0ed-ab5057788140&l=1029
54+
//[TestCase(ArgumentType.Metadata)]
55+
//[TestCase(ArgumentType.Bytes)]
5456
[TestCase(ArgumentType.Stream)]
5557
public async Task TestCreateAgent(ArgumentType argType)
5658
{

sdk/core/Azure.Core/api/Azure.Core.net6.0.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,9 @@ protected AsyncPageable(System.Threading.CancellationToken cancellationToken) {
1717
}
1818
public static partial class AzureCoreExtensions
1919
{
20-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2120
public static dynamic ToDynamicFromJson(this System.BinaryData utf8Json) { throw null; }
22-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2321
public static dynamic ToDynamicFromJson(this System.BinaryData utf8Json, Azure.Core.Serialization.JsonPropertyNames propertyNameFormat, string dateTimeFormat = "o") { throw null; }
2422
public static System.Threading.Tasks.ValueTask<T?> ToObjectAsync<T>(this System.BinaryData data, Azure.Core.Serialization.ObjectSerializer serializer, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
25-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2623
public static object? ToObjectFromJson(this System.BinaryData data) { throw null; }
2724
public static T? ToObject<T>(this System.BinaryData data, Azure.Core.Serialization.ObjectSerializer serializer, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
2825
}
@@ -95,10 +92,8 @@ public HttpAuthorization(string scheme, string parameter) { }
9592
}
9693
public partial class JsonPatchDocument
9794
{
98-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
9995
public JsonPatchDocument() { }
10096
public JsonPatchDocument(Azure.Core.Serialization.ObjectSerializer serializer) { }
101-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
10297
public JsonPatchDocument(System.ReadOnlyMemory<byte> rawDocument) { }
10398
public JsonPatchDocument(System.ReadOnlyMemory<byte> rawDocument, Azure.Core.Serialization.ObjectSerializer serializer) { }
10499
public void AppendAddRaw(string path, string rawJsonValue) { }
@@ -582,11 +577,8 @@ protected RequestContent() { }
582577
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
583578
public static Azure.Core.RequestContent Create(byte[] bytes, int index, int length) { throw null; }
584579
public static Azure.Core.RequestContent Create(System.IO.Stream stream) { throw null; }
585-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
586580
public static Azure.Core.RequestContent Create(object serializable) { throw null; }
587-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
588581
public static Azure.Core.RequestContent Create(object serializable, Azure.Core.Serialization.JsonPropertyNames propertyNameFormat, string dateTimeFormat = "o") { throw null; }
589-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
590582
public static Azure.Core.RequestContent Create(object serializable, Azure.Core.Serialization.ObjectSerializer? serializer) { throw null; }
591583
public static Azure.Core.RequestContent Create(System.ReadOnlyMemory<byte> bytes) { throw null; }
592584
public static Azure.Core.RequestContent Create(string content) { throw null; }
@@ -844,7 +836,6 @@ public partial interface IAzureClientFactoryBuilder
844836
}
845837
public partial interface IAzureClientFactoryBuilderWithConfiguration<in TConfiguration> : Azure.Core.Extensions.IAzureClientFactoryBuilder
846838
{
847-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")]
848839
Azure.Core.Extensions.IAzureClientBuilder<TClient, TOptions> RegisterClientFactory<TClient, TOptions>(TConfiguration configuration) where TOptions : class;
849840
}
850841
public partial interface IAzureClientFactoryBuilderWithCredential
@@ -1127,7 +1118,6 @@ public ServerCertificateCustomValidationArgs(System.Security.Cryptography.X509Ce
11271118
}
11281119
namespace Azure.Core.Serialization
11291120
{
1130-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This class utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
11311121
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerDisplay,nq}")]
11321122
public sealed partial class DynamicData : System.Dynamic.IDynamicMetaObjectProvider, System.IDisposable
11331123
{
@@ -1162,7 +1152,6 @@ public partial interface IMemberNameConverter
11621152
{
11631153
string? ConvertMemberName(System.Reflection.MemberInfo member);
11641154
}
1165-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This class uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
11661155
public partial class JsonObjectSerializer : Azure.Core.Serialization.ObjectSerializer, Azure.Core.Serialization.IMemberNameConverter
11671156
{
11681157
public JsonObjectSerializer() { }
@@ -1194,7 +1183,6 @@ protected ObjectSerializer() { }
11941183
}
11951184
namespace Azure.Messaging
11961185
{
1197-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
11981186
public partial class CloudEvent
11991187
{
12001188
public CloudEvent(string source, string type, System.BinaryData? data, string? dataContentType, Azure.Messaging.CloudEventDataFormat dataFormat = Azure.Messaging.CloudEventDataFormat.Binary) { }

sdk/core/Azure.Core/api/Azure.Core.net8.0.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,11 @@ protected AsyncPageable(System.Threading.CancellationToken cancellationToken) {
1818
public static partial class AzureCoreExtensions
1919
{
2020
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
21-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2221
public static dynamic ToDynamicFromJson(this System.BinaryData utf8Json) { throw null; }
2322
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
24-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2523
public static dynamic ToDynamicFromJson(this System.BinaryData utf8Json, Azure.Core.Serialization.JsonPropertyNames propertyNameFormat, string dateTimeFormat = "o") { throw null; }
2624
public static System.Threading.Tasks.ValueTask<T?> ToObjectAsync<T>(this System.BinaryData data, Azure.Core.Serialization.ObjectSerializer serializer, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
2725
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
28-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
2926
public static object? ToObjectFromJson(this System.BinaryData data) { throw null; }
3027
public static T? ToObject<T>(this System.BinaryData data, Azure.Core.Serialization.ObjectSerializer serializer, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
3128
}
@@ -99,11 +96,9 @@ public HttpAuthorization(string scheme, string parameter) { }
9996
public partial class JsonPatchDocument
10097
{
10198
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
102-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
10399
public JsonPatchDocument() { }
104100
public JsonPatchDocument(Azure.Core.Serialization.ObjectSerializer serializer) { }
105101
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
106-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("JsonObjectSerializer uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
107102
public JsonPatchDocument(System.ReadOnlyMemory<byte> rawDocument) { }
108103
public JsonPatchDocument(System.ReadOnlyMemory<byte> rawDocument, Azure.Core.Serialization.ObjectSerializer serializer) { }
109104
public void AppendAddRaw(string path, string rawJsonValue) { }
@@ -590,13 +585,10 @@ protected RequestContent() { }
590585
public static Azure.Core.RequestContent Create(byte[] bytes, int index, int length) { throw null; }
591586
public static Azure.Core.RequestContent Create(System.IO.Stream stream) { throw null; }
592587
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
593-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
594588
public static Azure.Core.RequestContent Create(object serializable) { throw null; }
595589
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
596-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
597590
public static Azure.Core.RequestContent Create(object serializable, Azure.Core.Serialization.JsonPropertyNames propertyNameFormat, string dateTimeFormat = "o") { throw null; }
598591
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
599-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This method uses reflection-based serialization which is incompatible with trimming. Try using one of the 'Create' overloads that doesn't wrap a serialized version of an object.")]
600592
public static Azure.Core.RequestContent Create(object serializable, Azure.Core.Serialization.ObjectSerializer? serializer) { throw null; }
601593
public static Azure.Core.RequestContent Create(System.ReadOnlyMemory<byte> bytes) { throw null; }
602594
public static Azure.Core.RequestContent Create(string content) { throw null; }
@@ -855,7 +847,6 @@ public partial interface IAzureClientFactoryBuilder
855847
public partial interface IAzureClientFactoryBuilderWithConfiguration<in TConfiguration> : Azure.Core.Extensions.IAzureClientFactoryBuilder
856848
{
857849
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")]
858-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")]
859850
Azure.Core.Extensions.IAzureClientBuilder<TClient, TOptions> RegisterClientFactory<TClient, TOptions>(TConfiguration configuration) where TOptions : class;
860851
}
861852
public partial interface IAzureClientFactoryBuilderWithCredential
@@ -1139,7 +1130,6 @@ public ServerCertificateCustomValidationArgs(System.Security.Cryptography.X509Ce
11391130
namespace Azure.Core.Serialization
11401131
{
11411132
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This class utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
1142-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This class utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
11431133
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerDisplay,nq}")]
11441134
public sealed partial class DynamicData : System.Dynamic.IDynamicMetaObjectProvider, System.IDisposable
11451135
{
@@ -1175,7 +1165,6 @@ public partial interface IMemberNameConverter
11751165
string? ConvertMemberName(System.Reflection.MemberInfo member);
11761166
}
11771167
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This class uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
1178-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This class uses reflection-based JSON serialization and deserialization that is not compatible with trimming.")]
11791168
public partial class JsonObjectSerializer : Azure.Core.Serialization.ObjectSerializer, Azure.Core.Serialization.IMemberNameConverter
11801169
{
11811170
public JsonObjectSerializer() { }
@@ -1208,7 +1197,6 @@ protected ObjectSerializer() { }
12081197
namespace Azure.Messaging
12091198
{
12101199
[System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
1211-
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("This utilizes reflection-based JSON serialization and deserialization which is not compatible with trimming.")]
12121200
public partial class CloudEvent
12131201
{
12141202
public CloudEvent(string source, string type, System.BinaryData? data, string? dataContentType, Azure.Messaging.CloudEventDataFormat dataFormat = Azure.Messaging.CloudEventDataFormat.Binary) { }

0 commit comments

Comments
 (0)