You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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会直接使用预生成的程序集,无需动态编译。

  1. 打开开发者命令提示符,定位到项目输出目录
  2. 执行命令(替换为你的程序集和类型信息):
sgen.exe /assembly:YourProject.dll /type:YourNamespace.MyBag3`1[YourNamespace.YourConcreteType]
  1. 将生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:21:13