UWP发布模式下DataSet序列化架构错误,调试模式正常
UWP发布模式下DataSet序列化错误的解决方案
问题原因
UWP发布模式启用的.NET Native编译会对未被显式引用的代码进行裁剪,DataSet的GetDataSetSchema静态方法(由XmlSchemaProviderAttribute指定)被误判为未使用而移除,导致序列化失败;调试模式未启用该优化,所以正常工作。
解决方法
1. 配置.NET Native保留DataSet的关键方法
在项目的Default.rd.xml文件中添加以下规则,强制编译器保留DataSet的相关方法和动态特性:
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <!-- 保留DataSet的XmlSchemaProvider指定的方法及动态特性 --> <Type Name="System.Data.DataSet" Dynamic="Required All"> <Method Name="GetDataSetSchema" Signature="System.Xml.Schema.XmlSchemaSet" /> </Type> </Application> </Directives>
添加后重新编译发布版本,该配置会阻止.NET Native移除DataSet序列化所需的核心方法。
2. 改用DataSet原生序列化方法替代通用序列化
放弃通用序列化框架(如XmlSerializer、DataContractSerializer),直接使用DataSet自带的序列化API,这类方法不受.NET Native优化影响,能稳定保存架构:
// 序列化操作 using (var fileStream = new FileStream("your_data_file.xml", FileMode.Create)) { // 先写入DataSet架构 yourDataSet.WriteXmlSchema(fileStream); // 写入数据(同时包含架构) yourDataSet.WriteXml(fileStream, XmlWriteMode.WriteSchema); } // 反序列化操作 using (var fileStream = new FileStream("your_data_file.xml", FileMode.Open)) { yourDataSet.ReadXmlSchema(fileStream); yourDataSet.ReadXml(fileStream); }
如果你的大型对象中仅DataSet部分序列化出问题,可以单独提取DataSet进行原生序列化,其余部分仍用原方式处理。
3. 禁用特定优化选项(临时方案)
如果上述方法无效,可以尝试在发布配置中禁用.NET Native的部分优化:
- 右键项目 → 属性 → 生成 → 发布配置 → 取消勾选“启用 .NET Native 工具链”
注意:此方法会增大发布包体积,仅作为临时排查手段。
内容的提问来源于stack exchange,提问作者Calphalon
相关产品推荐
相关产品推荐

