【问题标题】:How to serialize/de-serialize a custom DataSet如何序列化/反序列化自定义数据集
【发布时间】:2011-10-25 15:07:55
【问题描述】:

我有一个 winforms 应用程序,它使用强类型自定义 DataSet 来保存数据以进行处理。它使用来自数据库的数据填充。

我有一个用户控件,它接受任何自定义数据集并在数据网格中显示内容。这用于测试和调试。为了使控件可重用,我将自定义数据集视为普通的 System.Data.DataSet。

我已扩展控件以允许将数据集保存到 XML 文件并加载以前保存的 XML 文件。

我现在要做的是获取加载的数据文件,它被视为标准数据集,并将其转换回自定义数据集。这应该不难,但我收到以下 System.InvalidCastException 消息:

无法将“System.Data.DataSet”类型的对象转换为类型 '成本数据集'。

这是问题代码的示例(它是生成异常的 3 行的最后一行):

DataSet selected = debugDisplay.SelectedDataSet;

CostingDataSet tempDS = new CostingDataSet();
tempDS = (CostingDataSet)selected.Copy();

谁能指导我如何解决这个问题?

编辑: 根据 nEM 的 cmets,我实现了这一点,一切都很好。

foreach (System.Data.DataTable basicDT in selected.Tables)
{
    DataTable dt = tempDS.Tables[basicDT.TableName];
    dt = basicDT.Copy();
}

另外,SSarma 推荐的代码也可以。

【问题讨论】:

  • 我认为对于自定义对象,您需要在自定义对象类上使用可序列化属性...并提供序列化和反序列化构造函数。你在这样做吗?
  • @nEM 我使用 CustomTool "MSDATASETGENERATOR" 创建数据集后面的代码,这是可序列化的。在将自定义数据集传递给我的控件之前,它会被转换为标准数据集以进行显示。
  • 其实我不认为标准的数据集可以转换为强类型数据集。您可能需要一个类来重新填充它。

标签: c# serialization deserialization strongly-typed-dataset


【解决方案1】:

根据我从this website 收集到的信息,您无法将常规数据集转换为类型化数据集,因为它是强类型化的并且具有一定的规范。如果您已将其保存为常规数据集,则当您对其进行反序列化时,XML 不会记得它曾被创建为类型化数据集。对于 xml 文件,您只保存了一个常规数据集,因此这相当于尝试通过不允许的显式转换将标准数据集转换为类型化数据集。

您可以创建一个接收常规数据集作为参数的填充方法,该方法将所有数据复制到您的类型化数据集中。

这是假设您将其序列化为标准数据集。

【讨论】:

  • 这很有意义。谢谢。我会进一步调查。
【解决方案2】:

如何使用 Streams(抱歉,以下代码未经过测试)但您明白了

 DataSet selected = debugDisplay.SelectedDataSet;

  string ds1 = selected.GetXml();
  CostingDataSet tempDS = new CostingDataSet();
  System.IO.MemoryStream ms = new System.IO.MemoryStream(ds1.Length);
  selected.WriteXml(ms);
  ms.Position = 0;

  tempDS.ReadXml(ms);

【讨论】:

  • 是的。虽然我想出了一个稍微不同的方法,通过遍历数据集中的表并加载每个表,但这很有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多