XmlSerializer报Compiling JScript/CSharp scripts is not supported错误如何解决
问题解决思路
- 确认
SistemEcuatii类的访问修饰符为public,Rational类同样需要设置为public且包含无参数公共构造函数,所有参与序列化的属性/字段均为公共可读写状态。 - 调整
XmlSerializer实例的初始化时机:不要在类的字段声明阶段直接初始化,改为静态懒加载模式,避免静态构造阶段触发动态编译异常,同时补充using语法自动释放IO资源避免文件句柄泄漏,修改后的代码如下:
class SistemEcuatiiModel { string baza; // 改为静态只读字段,全局仅初始化一次 private static readonly XmlSerializer serializer = new XmlSerializer(typeof(SistemEcuatii)); SistemEcuatii data; public void WriteTo() { using (TextWriter writer = new StreamWriter(baza)) { serializer.Serialize(writer, data); } } void LoadFromFile() { using (StreamReader streamer = new StreamReader(baza)) { SistemEcuatii dt = (SistemEcuatii)serializer.Deserialize(streamer); data = dt; } } }
- 给交错数组属性添加明确的序列化特性,避免XmlSerializer自动推断类型出错:
[XmlIgnore] public Rational[,] tab; [XmlArray] public Rational[][] Data { get { Rational[][] dt = new Rational[tab.GetLength(0)][]; for (int i = 0; i < tab.GetLength(0); i++) { dt[i] = new Rational[tab.GetLength(1)]; for (int j = 0; j < tab.GetLength(1); j++) dt[i][j] = tab[i, j]; } return dt; } set { tab = new Rational[value.Length, value[0].Length]; for (int i = 0; i < tab.GetLength(0); i++) for (int j = 0; j < tab.GetLength(1); j++) tab[i, j] = value[i][j]; } }
- 如果你使用的是.NET Core 3.1+、.NET 5+版本,且启用了发布裁剪、AOT编译配置,需要在项目文件(.csproj)中添加配置预先生成序列化程序集,避免运行时动态编译触发平台不支持异常:
<PropertyGroup> <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies> </PropertyGroup>
- 排查验证:可临时将
Data属性的类型替换为int[][]测试序列化是否正常,排除Rational自定义类型的序列化逻辑兼容性问题。
内容的提问来源于stack exchange,提问作者armagedescu
相关产品推荐
相关产品推荐

