From fef1fd4104b525b24bd3f8bfa1d4ed514d8fb093 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:59:22 +0000 Subject: [PATCH 1/4] Add JsonSerializerOptions property to support AOT serialization Agent-Logs-Url: https://github.com/XFEstudio/XFEExtension.NetCore.AutoConfig/sessions/8939dfa1-a714-424c-8b4a-898272447114 Co-authored-by: XFEstudio <132526994+XFEstudio@users.noreply.github.com> --- XFEExtension.NetCore.AutoConfig/XFEProfile.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/XFEExtension.NetCore.AutoConfig/XFEProfile.cs b/XFEExtension.NetCore.AutoConfig/XFEProfile.cs index 824499c..5da928a 100644 --- a/XFEExtension.NetCore.AutoConfig/XFEProfile.cs +++ b/XFEExtension.NetCore.AutoConfig/XFEProfile.cs @@ -13,6 +13,10 @@ public abstract class XFEProfile { private string id = Guid.NewGuid().ToString(); /// + /// JSON序列化选项,用于配置序列化行为(支持AOT) + /// + public static JsonSerializerOptions JsonOptions { get; set; } = new JsonSerializerOptions(); + /// /// 配置文件所在的默认目录 /// public static string ProfilesDefaultPath { get; set; } = $@"{AppDomain.CurrentDomain.BaseDirectory}Profiles"; @@ -61,7 +65,7 @@ public abstract class XFEProfile XFEDictionary propertyFileContent = profileString; foreach (var property in propertyFileContent) if (propertySetFuncDictionary.TryGetValue(property.Header, out var setValueDelegate) && propertyInfoDictionary.TryGetValue(property.Header, out var type)) - setValueDelegate(JsonSerializer.Deserialize(property.Content, type)); + setValueDelegate(JsonSerializer.Deserialize(property.Content, type, JsonOptions)); return null; } /// @@ -77,7 +81,7 @@ public static string XFEDictionarySaveProfileOperation(XFEProfile profileInstanc return string.Empty; var saveProfileDictionary = new XFEDictionary(); foreach (var property in propertyGetFuncDictionary) - saveProfileDictionary.Add(property.Key, JsonSerializer.Serialize(property.Value())); + saveProfileDictionary.Add(property.Key, JsonSerializer.Serialize(property.Value(), JsonOptions)); return saveProfileDictionary.ToString(); } /// @@ -88,7 +92,7 @@ public static string XFEDictionarySaveProfileOperation(XFEProfile profileInstanc /// 配置文件 “属性名称-属性类型” 字典 /// 配置文件 “属性名称-属性设置方法” 字典 /// 配置文件实例 - public static XFEProfile? JsonLoadProfileOperation(XFEProfile profileInstance, string profileString, Dictionary propertyInfoDictionary, Dictionary propertySetFuncDictionary) => JsonSerializer.Deserialize(profileString, profileInstance.GetType()) is XFEProfile xFEProfile ? xFEProfile : null; + public static XFEProfile? JsonLoadProfileOperation(XFEProfile profileInstance, string profileString, Dictionary propertyInfoDictionary, Dictionary propertySetFuncDictionary) => JsonSerializer.Deserialize(profileString, profileInstance.GetType(), JsonOptions) is XFEProfile xFEProfile ? xFEProfile : null; /// /// 通过Json保存配置文件方法 @@ -97,7 +101,7 @@ public static string XFEDictionarySaveProfileOperation(XFEProfile profileInstanc /// 配置文件 “属性名称-属性类型” 字典 /// 配置文件 “属性名称-属性值获取方法” 字典 /// 保存内容 - public static string JsonSaveProfileOperation(XFEProfile profileInstance, Dictionary propertyInfoDictionary, Dictionary propertyGetFuncDictionary) => profileInstance is null ? string.Empty : JsonSerializer.Serialize(profileInstance, profileInstance.GetType()); + public static string JsonSaveProfileOperation(XFEProfile profileInstance, Dictionary propertyInfoDictionary, Dictionary propertyGetFuncDictionary) => profileInstance is null ? string.Empty : JsonSerializer.Serialize(profileInstance, profileInstance.GetType(), JsonOptions); /// /// 通过XML加载配置文件方法 /// @@ -214,9 +218,9 @@ internal protected void SetProfileOperation() private static Func SaveProfilesFunc { get; set; } = (i, p) => { if (p.MemberInfo is FieldInfo fieldInfo) - return JsonSerializer.Serialize(fieldInfo.GetValue(i)); + return JsonSerializer.Serialize(fieldInfo.GetValue(i), JsonOptions); else if (p.MemberInfo is PropertyInfo propertyInfo) - return JsonSerializer.Serialize(propertyInfo.GetValue(i)); + return JsonSerializer.Serialize(propertyInfo.GetValue(i), JsonOptions); else return string.Empty; }; @@ -224,9 +228,9 @@ internal protected void SetProfileOperation() private static Func LoadProfilesFunc { get; set; } = (x, p) => { if (p.MemberInfo is FieldInfo fieldInfo) - return JsonSerializer.Deserialize(x, fieldInfo.FieldType); + return JsonSerializer.Deserialize(x, fieldInfo.FieldType, JsonOptions); else if (p.MemberInfo is PropertyInfo propertyInfo) - return JsonSerializer.Deserialize(x, propertyInfo.PropertyType); + return JsonSerializer.Deserialize(x, propertyInfo.PropertyType, JsonOptions); else return null; }; From fa087bc54689a9c4c21b6272a1c4ee718b70ed76 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:00:02 +0000 Subject: [PATCH 2/4] Add JsonSerializerContext for AOT support in test project Agent-Logs-Url: https://github.com/XFEstudio/XFEExtension.NetCore.AutoConfig/sessions/8939dfa1-a714-424c-8b4a-898272447114 Co-authored-by: XFEstudio <132526994+XFEstudio@users.noreply.github.com> --- .../ProfileJsonContext.cs | 19 +++++++++++++++++++ AutoConfig.Analyzer.Test/Program.cs | 7 +++++++ .../XFEExtension.NetCore.XUnit.Test.csproj | 1 - 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 AutoConfig.Analyzer.Test/ProfileJsonContext.cs diff --git a/AutoConfig.Analyzer.Test/ProfileJsonContext.cs b/AutoConfig.Analyzer.Test/ProfileJsonContext.cs new file mode 100644 index 0000000..b6774b5 --- /dev/null +++ b/AutoConfig.Analyzer.Test/ProfileJsonContext.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; +using XFEExtension.NetCore.AutoConfig; + +namespace XFEExtension.NetCore.XUnit.Test; + +/// +/// JSON序列化上下文,用于AOT编译支持 +/// +[JsonSerializable(typeof(UserInfo))] +[JsonSerializable(typeof(ProfileList))] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(string))] +[JsonSerializable(typeof(int))] +[JsonSerializable(typeof(bool))] +[JsonSerializable(typeof(DateTime))] +[JsonSerializable(typeof(Guid))] +public partial class ProfileJsonContext : JsonSerializerContext +{ +} diff --git a/AutoConfig.Analyzer.Test/Program.cs b/AutoConfig.Analyzer.Test/Program.cs index 407bbb2..4c25208 100644 --- a/AutoConfig.Analyzer.Test/Program.cs +++ b/AutoConfig.Analyzer.Test/Program.cs @@ -1,6 +1,7 @@ using AutoConfig.Analyzer.Test; using System.Diagnostics.CodeAnalysis; using System.Text.Json; +using XFEExtension.NetCore.AutoConfig; using XFEExtension.NetCore.StringExtension; using XFEExtension.NetCore.StringExtension.Json; @@ -11,6 +12,12 @@ public class Program [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(UserInfo))] public static void Main(string[] args) { + // 配置AOT兼容的JSON序列化选项 + XFEProfile.JsonOptions = new JsonSerializerOptions + { + TypeInfoResolver = ProfileJsonContext.Default + }; + //Console.WriteLine($"上一次读取的值是{SystemProfile.MyText}"); //var current = SystemProfile.Current; //Console.Write("添加值:"); diff --git a/AutoConfig.Analyzer.Test/XFEExtension.NetCore.XUnit.Test.csproj b/AutoConfig.Analyzer.Test/XFEExtension.NetCore.XUnit.Test.csproj index 11e59aa..5178d0d 100644 --- a/AutoConfig.Analyzer.Test/XFEExtension.NetCore.XUnit.Test.csproj +++ b/AutoConfig.Analyzer.Test/XFEExtension.NetCore.XUnit.Test.csproj @@ -6,7 +6,6 @@ enable enable true - true From 6723775a5ee1de6569ea989deff0a146b74e4184 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:02:23 +0000 Subject: [PATCH 3/4] Fix AOT compatibility - update test project and restore package generation Agent-Logs-Url: https://github.com/XFEstudio/XFEExtension.NetCore.AutoConfig/sessions/8939dfa1-a714-424c-8b4a-898272447114 Co-authored-by: XFEstudio <132526994+XFEstudio@users.noreply.github.com> --- AutoConfig.Analyzer.Test/Program.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/AutoConfig.Analyzer.Test/Program.cs b/AutoConfig.Analyzer.Test/Program.cs index 4c25208..c2cf253 100644 --- a/AutoConfig.Analyzer.Test/Program.cs +++ b/AutoConfig.Analyzer.Test/Program.cs @@ -1,5 +1,4 @@ -using AutoConfig.Analyzer.Test; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using XFEExtension.NetCore.AutoConfig; using XFEExtension.NetCore.StringExtension; @@ -45,7 +44,7 @@ public static void Main(string[] args) EndDateTime = DateTime.Now }; Console.WriteLine(target.ShopID); - Console.WriteLine(JsonSerializer.Serialize(target)); + Console.WriteLine(JsonSerializer.Serialize(target, ProfileJsonContext.Default.UserInfo)); Console.WriteLine("对象创建完成!准备进行分析..."); target.X(); Console.WriteLine(target.ToJson()); From 76c7b3aa2ea74f363b24b857adadbeaeaf135188 Mon Sep 17 00:00:00 2001 From: "anthropic-code-agent[bot]" <242468646+Claude@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:02:50 +0000 Subject: [PATCH 4/4] Add AOT support documentation Agent-Logs-Url: https://github.com/XFEstudio/XFEExtension.NetCore.AutoConfig/sessions/8939dfa1-a714-424c-8b4a-898272447114 Co-authored-by: XFEstudio <132526994+XFEstudio@users.noreply.github.com> --- AOT_SUPPORT.md | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 AOT_SUPPORT.md diff --git a/AOT_SUPPORT.md b/AOT_SUPPORT.md new file mode 100644 index 0000000..d67a4ac --- /dev/null +++ b/AOT_SUPPORT.md @@ -0,0 +1,95 @@ +# AOT (Ahead-of-Time) 编译支持 + +## 概述 + +从版本 2.0.8 开始,XFEExtension.NetCore.AutoConfig 支持 .NET Native AOT 编译。 + +## 问题背景 + +在使用 Native AOT 编译时,默认情况下 .NET 会禁用基于反射的 JSON 序列化,这会导致以下错误: + +``` +System.InvalidOperationException: Reflection-based serialization has been disabled for this application. +Either use the source generator APIs or explicitly configure the 'JsonSerializerOptions.TypeInfoResolver' property. +``` + +## 解决方案 + +### 1. 创建 JsonSerializerContext + +为您的应用程序创建一个 `JsonSerializerContext`,包含所有需要序列化的类型: + +```csharp +using System.Text.Json.Serialization; +using XFEExtension.NetCore.AutoConfig; + +namespace YourApp; + +[JsonSerializable(typeof(YourDataType))] +[JsonSerializable(typeof(ProfileList))] +[JsonSerializable(typeof(string))] +[JsonSerializable(typeof(int))] +[JsonSerializable(typeof(bool))] +[JsonSerializable(typeof(DateTime))] +// 添加其他您需要序列化的类型 +public partial class AppJsonContext : JsonSerializerContext +{ +} +``` + +### 2. 配置 JsonSerializerOptions + +在程序启动时配置 `XFEProfile.JsonOptions`: + +```csharp +using System.Text.Json; +using XFEExtension.NetCore.AutoConfig; + +// 在 Main 方法或启动代码中 +XFEProfile.JsonOptions = new JsonSerializerOptions +{ + TypeInfoResolver = AppJsonContext.Default +}; +``` + +### 3. 项目配置 + +在您的 `.csproj` 文件中启用 AOT: + +```xml + + true + +``` + +**注意**:不再需要 `true` 设置。 + +## 完整示例 + +参考 `AutoConfig.Analyzer.Test` 项目中的示例: + +1. `ProfileJsonContext.cs` - JsonSerializerContext 定义 +2. `Program.cs` - JsonOptions 配置示例 + +## 常见问题 + +### Q: 我需要为每个类型都添加 JsonSerializable 属性吗? + +A: 是的,所有在配置文件中使用的类型都需要添加。包括: +- 配置文件中的数据类型 +- 泛型类型(如 `ProfileList`) +- 基础类型(string, int, bool, DateTime 等) + +### Q: 如果我不使用 AOT 编译,还需要配置 JsonOptions 吗? + +A: 不需要。如果不使用 AOT,库会使用默认的反射序列化,无需额外配置。 + +### Q: 我可以在运行时更改 JsonOptions 吗? + +A: 可以,但建议在应用程序启动时配置一次,避免在使用过程中修改。 + +## 技术细节 + +- `XFEProfile.JsonOptions` 是一个静态属性,所有配置文件实例共享 +- 所有 JSON 序列化操作(`JsonSerializer.Serialize` 和 `JsonSerializer.Deserialize`)都使用此选项 +- 支持的序列化模式:XFEDictionary(默认)、JSON、XML