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

.NET8 XAF WinForms升级后CodeDOM反序列化报错求助

解决XAF从.NET Framework升级到.NET8后的报表反序列化错误

问题原因

.NET Core/.NET 5+ 移除了对CodeDOM格式反序列化的支持,而你原来存储在ReportDataV2表Content字段的报表是CodeDOM格式,因此运行时抛出Deserialization from CodeDOM format is not supported in .NET Core applications错误。必须将报表格式转换为XML格式才能在.NET8环境中正常使用。

可行解决方案

不需要依赖旧版XAF或VS2022不兼容的组件,直接通过以下两种方式完成格式转换:

方案一:在.NET Framework控制台项目中批量转换(推荐)

这个方案无需依赖原XAF项目,仅使用DevExpress报表控件完成转换:

  1. 创建项目:在VS2022中新建一个.NET Framework 4.8控制台项目(VS2022完全兼容.NET Framework 4.8项目)。
  2. 安装NuGet包:安装与原项目匹配版本的DevExpress.XtraReports.vXX.X NuGet包(比如原项目用20.2.3就装对应版本)。
  3. 编写转换代码:替换数据库连接字符串后运行:
using System;
using System.Data.SqlClient;
using System.IO;
using DevExpress.XtraReports.UI;

namespace ReportConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            // 替换为你的数据库连接字符串
            string connString = "Data Source=YOUR_SERVER;Initial Catalog=YOUR_DB;Integrated Security=True";
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                // 读取所有报表记录
                string selectSql = "SELECT Oid, Content FROM ReportDataV2";
                using (SqlCommand cmd = new SqlCommand(selectSql, conn))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Guid oid = reader.GetGuid(0);
                            byte[] oldContent = (byte[])reader[1];
                            try
                            {
                                // 从CodeDOM格式加载报表
                                using (MemoryStream ms = new MemoryStream(oldContent))
                                {
                                    XtraReport report = XtraReport.FromStream(ms, true);
                                    // 保存为XML格式
                                    using (MemoryStream xmlMs = new MemoryStream())
                                    {
                                        report.SaveLayoutToXml(xmlMs);
                                        byte[] newContent = xmlMs.ToArray();
                                        // 更新数据库字段
                                        string updateSql = "UPDATE ReportDataV2 SET Content = @Content WHERE Oid = @Oid";
                                        using (SqlCommand updateCmd = new SqlCommand(updateSql, conn))
                                        {
                                            updateCmd.Parameters.AddWithValue("@Content", newContent);
                                            updateCmd.Parameters.AddWithValue("@Oid", oid);
                                            updateCmd.ExecuteNonQuery();
                                            Console.WriteLine($"报表 {oid} 转换成功");
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"报表 {oid} 转换失败: {ex.Message}");
                            }
                        }
                    }
                }
            }
            Console.WriteLine("所有报表转换完成");
            Console.ReadKey();
        }
    }
}
  1. 执行转换:运行控制台程序,完成后备份数据库,再启动.NET8的XAF项目即可。

方案二:在原.NET Framework XAF项目中提前转换

如果原.NET Framework项目还能正常运行,可以直接在项目中添加转换逻辑:

  1. 添加ViewController:在原项目的Module项目中新建一个ViewController:
using DevExpress.ExpressApp;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
using DevExpress.XtraReports.UI;
using System.IO;

namespace YourSolutionName.Module.Controllers
{
    public class ConvertReportsController : ViewController<ListView>
    {
        public ConvertReportsController()
        {
            TargetObjectType = typeof(ReportDataV2);
            SimpleAction convertAction = new SimpleAction(this, "ConvertToXmlFormat", PredefinedCategory.Edit);
            convertAction.Execute += ConvertAction_Execute;
        }

        private void ConvertAction_Execute(object sender, SimpleActionExecuteEventArgs e)
        {
            foreach (ReportDataV2 reportData in e.SelectedObjects)
            {
                using (MemoryStream ms = new MemoryStream(reportData.Content))
                {
                    XtraReport report = XtraReport.FromStream(ms, true);
                    using (MemoryStream xmlMs = new MemoryStream())
                    {
                        report.SaveLayoutToXml(xmlMs);
                        reportData.Content = xmlMs.ToArray();
                    }
                }
            }
            ObjectSpace.CommitChanges();
            View.Refresh();
            Application.ShowViewStrategy.ShowMessage("报表格式转换完成");
        }
    }
}
  1. 执行转换:运行原XAF项目,打开报表列表视图,选中所有报表,点击新增的ConvertToXmlFormat动作,提交更改后再升级项目到.NET8。

注意事项

  • 转换前务必备份数据库,避免数据丢失。
  • 确保使用的DevExpress报表版本与原项目一致,否则可能出现读取报表失败的情况。
  • 转换后ReportDataV2的Content字段类型无需修改,仍为byte[],存储的是XML格式的二进制数据。

内容的提问来源于stack exchange,提问作者Kirsten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:32:38