.NET Core中XmlSerializer.GenerateSerializer带映射与编译参数的等效方案问询
.NET Core下替代XmlSerializer.GenerateSerializer的方案
首先明确:Microsoft.XmlSerializer.Generator是编译时预生成序列化器的工具,和.NET Framework中XmlSerializer.GenerateSerializer这种运行时动态生成并缓存程序集的机制本质不同,所以没有完全匹配的等效API。但可以根据你的需求选择以下替代方式:
1. 无需自定义XML映射的场景
直接使用Microsoft.XmlSerializer.Generator包即可:
- 安装包后,编译阶段会自动为项目中的目标类型生成序列化器程序集
- 运行时直接实例化
XmlSerializer(传入目标类型),框架会自动加载预生成的序列化器,无需手动调用生成方法,同样能实现缓存、降低资源消耗的效果
2. 需要保留自定义XML映射的场景
如果你的业务依赖自定义的XmlMapping(比如通过XmlAttributeOverrides创建的映射),可以采用以下两种方式:
方式一:继续使用过时但可用的XmlSerializer.GenerateSerializer
.NET Core/.NET 5+中,System.Xml.Serialization.XmlSerializer.GenerateSerializer方法被标记为过时,但仍然可以正常调用。需要注意:
- 第三个参数
CompilerParameters会被忽略,因为.NET Core不再依赖System.CodeDom的编译器,动态生成改用Roslyn实现 - 程序集的缓存逻辑由框架自动处理,和原.NET Framework行为一致
方式二:直接实例化XmlSerializer(推荐)
不需要手动调用生成方法,直接通过XmlSerializer的构造函数传入类型和自定义映射(XmlAttributeOverrides或XmlMapping):
var serializer = new XmlSerializer(type, xmlMapping);
框架会自动在首次调用时动态生成序列化器程序集并缓存,后续复用,效果和原GenerateSerializer的缓存机制一致。
关于CompilerParameters的替代
原代码中CompilerParameters用于配置动态编译的参数(比如程序集输出路径、引用集),在.NET Core中:
- 框架默认的动态序列化器缓存路径是系统临时目录,无需手动指定
- 如果需要自定义缓存逻辑,可通过
XmlSerializerCache相关API或者手动管理序列化器实例的缓存(比如用字典缓存已创建的XmlSerializer实例)
内容的提问来源于stack exchange,提问作者beerus_hakai
相关产品推荐
相关产品推荐

