使用XmlSerializer序列化泛型对象时出现PlatformNotSupportedException异常
解决泛型对象XML序列化引发的PlatformNotSupportedException问题
问题原因
当启用MyBag3泛型类的序列化代码时,XmlSerializer会尝试动态生成序列化程序集以处理泛型类型。在部分.NET平台(如.NET Core 3.0+、.NET 5+受限环境、UWP等)中,动态JScript/C#代码编译被禁用,从而抛出System.PlatformNotSupportedException——即使代码中没有脚本内容。
保留类结构的解决方案
方案1:使用XmlSerializerFactory创建序列化器
XmlSerializerFactory可以缓存生成的序列化程序集,避免重复动态编译,同时在多数允许生成程序集的环境下正常工作。示例代码:
// 初始化序列化器工厂 var serializerFactory = new XmlSerializerFactory(); // 创建针对具体泛型类型的序列化器 var serializer = serializerFactory.CreateSerializer(typeof(MyBag3<YourConcreteType>)); // 执行序列化 using (var streamWriter = new StreamWriter("output.xml")) { serializer.Serialize(streamWriter, yourBag3Instance); }
方案2:预生成序列化程序集
使用.NET工具sgen.exe提前为泛型类型生成序列化程序集,运行时XmlSerializer会直接使用预生成的程序集,无需动态编译。
- 打开开发者命令提示符,定位到项目输出目录
- 执行命令(替换为你的程序集和类型信息):
sgen.exe /assembly:YourProject.dll /type:YourNamespace.MyBag3`1[YourNamespace.YourConcreteType]
- 将生成的
YourProject.XmlSerializers.dll放入应用程序运行目录即可。
方案3:启用动态代码编译(仅适用于非受限环境)
如果你的应用运行在桌面等不受限环境中,可以在项目文件中启用动态代码编译:
<PropertyGroup> <EnableDynamicCodeCompilation>true</EnableDynamicCodeCompilation> </PropertyGroup>
注意:该方案不适用于Azure Functions、UWP等受限平台。
方案4:改用DataContractSerializer(需调整属性)
如果可以接受XML结构的细微变化,DataContractSerializer无需动态编译,基于反射实现序列化。需要为泛型类添加相关属性:
using System.Runtime.Serialization; [DataContract(Name = "MyBag3")] public class MyBag3<T> { [DataMember] public T Content { get; set; } }
序列化代码示例:
var serializer = new DataContractSerializer(typeof(MyBag3<YourConcreteType>)); using (var xmlWriter = XmlWriter.Create("output.xml")) { serializer.WriteObject(xmlWriter, yourBag3Instance); }
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

