diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cdbf0b..53fc413 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.3.1] - 2024-05-20 + +### Changed + +- Updated serialization and deserialization of enums to remove LINQ to resolve NativeAOT compatibility issue + ## [1.3.0] - 2024-05-13 ### Added diff --git a/src/JsonParseNode.cs b/src/JsonParseNode.cs index f91286e..dacb1db 100644 --- a/src/JsonParseNode.cs +++ b/src/JsonParseNode.cs @@ -224,12 +224,21 @@ public JsonParseNode(JsonElement node, KiotaJsonSerializationContext jsonSeriali rawValue = ToEnumRawName(rawValue!); if(type.GetCustomAttributes().Any()) { - return (T)(object)rawValue! - .Split(',') - .Select(x => Enum.TryParse(x, true, out var result) ? result : (T?)null) - .Where(x => !x.Equals(null)) - .Select(x => (int)(object)x!) - .Sum(); + ReadOnlySpan valueSpan = rawValue.AsSpan(); + int value = 0; + while(valueSpan.Length > 0) + { + int commaIndex = valueSpan.IndexOf(','); + ReadOnlySpan valueNameSpan = commaIndex < 0 ? valueSpan : valueSpan.Slice(0, commaIndex); +#if NET6_0_OR_GREATER + if(Enum.TryParse(valueNameSpan, true, out var result)) +#else + if(Enum.TryParse(valueNameSpan.ToString(), true, out var result)) +#endif + value |= (int)(object)result; + valueSpan = commaIndex < 0 ? ReadOnlySpan.Empty : valueSpan.Slice(commaIndex + 1); + } + return (T)(object)value; } else return Enum.TryParse(rawValue, true,out var result) ? result : null; diff --git a/src/JsonSerializationWriter.cs b/src/JsonSerializationWriter.cs index 4674569..acaa4fd 100644 --- a/src/JsonSerializationWriter.cs +++ b/src/JsonSerializationWriter.cs @@ -13,6 +13,8 @@ using Microsoft.Kiota.Abstractions.Extensions; using Microsoft.Kiota.Abstractions; using System.Xml; +using System.Text; + #if NET5_0_OR_GREATER using System.Diagnostics.CodeAnalysis; #endif @@ -278,16 +280,25 @@ public void WriteEnumValue(string? key, T? value) where T : struct, Enum if(value.HasValue) { if(typeof(T).GetCustomAttributes().Any()) - WriteStringValue(null, + { + var values = #if NET5_0_OR_GREATER - Enum.GetValues() + Enum.GetValues(); #else - Enum.GetValues(typeof(T)) - .Cast() + Enum.GetValues(typeof(T)).Cast(); #endif - .Where(x => value.Value.HasFlag(x)) - .Select(GetEnumName) - .Aggregate((x, y) => $"{x},{y}")); + StringBuilder valueNames = new StringBuilder(); + foreach (var x in values) + { + if(value.Value.HasFlag(x) && GetEnumName(x) is string valueName) + { + if (valueNames.Length > 0) + valueNames.Append(","); + valueNames.Append(valueName); + } + } + WriteStringValue(null, valueNames.ToString()); + } else WriteStringValue(null, GetEnumName(value.Value)); } } diff --git a/src/Microsoft.Kiota.Serialization.Json.csproj b/src/Microsoft.Kiota.Serialization.Json.csproj index 623331d..10df288 100644 --- a/src/Microsoft.Kiota.Serialization.Json.csproj +++ b/src/Microsoft.Kiota.Serialization.Json.csproj @@ -15,7 +15,7 @@ https://aka.ms/kiota/docs true true - 1.3.0 + 1.3.1 true true