【问题标题】:Error serializing DataSet to XML将 DataSet 序列化为 XML 时出错
【发布时间】:2016-03-02 08:21:46
【问题描述】:

我正在尝试将 DataSet 序列化为 XML 文件。 从示例输出中可以看出,我的所有表都有名称,数据集也被命名。数据集命名空间是“”,更改它没有效果。 被捕获的异常是:

无法序列化 DataTable。数据表名称未设置。

正如您在下面很清楚地看到的那样,所有表都已命名。

DataSet Name: TestDataSet
Table:        TABLE1
Table:        TABLE2
Table:        TABLE3
Table:        TABLE4
Table:        TABLE5

无法序列化 DataTable。数据表名称未设置。

这是我用来序列化数据集的代码:

using (FileStream stream = new FileStream("db.xml", FileMode.Create))
{
    dataSet.WriteXml(stream, XmlWriteMode.WriteSchema);
    stream.Close();
}

如果XmlWriteModeWriteSchema,则创建 xml 文件并填充架构,仍然会引发异常。如果XmlWriteModeIgnoreSchema 并创建空文件并抛出异常。

是什么导致了这个问题?我在这里和网络上的其他地方浏览了大量帖子,每个人都说“设置表名”。我已经这样做了,但没有任何区别。

【问题讨论】:

  • 过去一个 db.xml。没有所有行,只有一些数据。
  • 问题可能出在生成数据集的代码中,您必须提供此代码或生成相同错误的示例(模型)。
  • 我想我已经弄清楚问题所在了。使用 JSON.NET 将数据从 JSON 反序列化到数据集中。某些表中的一列将其类型设置为 DataTable。我认为序列化程序不知道如何处理这些列。这有意义吗?
  • DataSet 是这样创建的:DataSet dataSet = JsonConvert.DeserializeObject(jsonData);

标签: c# xml serialization dataset xml-serialization


【解决方案1】:

根据 cmets,问题是由于 Dataset 中的某些表未指定名称。它可能是辅助表(Table1、Table2 等内的表元素)。

解决方案可能是迭代数据集中的所有对象,如果类型是 DataTable,则设置一个通用名称。

【讨论】:

  • 感谢您的意见。这正是我所需要的。
  • 不客气,我也会提供 sn-p 代码来进行迭代,以便进一步帮助您,但我现在看到您已经做到了。很好,我支持你 ;-)
【解决方案2】:

这是我采用的解决方案,它有效。 可能不是最有效的,但 XML 现在已正确序列化。

    private void FixTables(DataTable table)
    {
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn column in table.Columns)
            {
                var columnName = column.ColumnName;
                if (column.DataType == typeof(DataTable) && row[columnName] != DBNull.Value)
                {
                    DataTable innerTable = (DataTable)row[columnName];
                    innerTable.TableName = columnName;
                }
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2013-06-25
    • 2015-01-31
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多