Как сериализовать / десериализовать пользовательский набор данных - PullRequest
3 голосов
/ 25 октября 2011

У меня есть приложение winforms, которое использует строго типизированный пользовательский набор данных для хранения данных для обработки.Он заполняется данными из базы данных.

У меня есть пользовательский элемент управления, который берет любой пользовательский набор данных и отображает содержимое в сетке данных.Это используется для тестирования и отладки.Чтобы сделать элемент управления повторно используемым, я рассматриваю пользовательский набор данных как обычный System.Data.DataSet.

Я расширил элемент управления, чтобы разрешить сохранение набора данных в файл XML, а также загрузить ранее сохраненные файлы XML.

То, что я сейчас пытаюсь сделать, это взять загруженный файл данных, который рассматривается как стандартный набор данных, и вернуть его в набор пользовательских данных.Это не должно быть сложно, но я получаю следующее сообщение System.InvalidCastException:

Невозможно привести объект типа 'System.Data.DataSet' к типу 'CostingDataSet'.

Вот пример кода проблемы (это последняя строка 3, которая генерирует исключение):

DataSet selected = debugDisplay.SelectedDataSet;

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

Кто-нибудь может подсказать мне, как это исправить?

Редактировать: После комментариев nEM я реализовал это, и все было хорошо.

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

Кроме того, также работает код, предложенный SSarma.

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

Из того, что я собрал с этого сайта , вы не можете преобразовать обычный набор данных в типизированный, который имеет смысл, поскольку он строго типизирован и имеет определенные спецификации.Если вы сохранили его как обычный набор данных, при десериализации его XML не помнит, что он когда-либо создавался как типизированный набор данных.Для файла xml вы когда-либо сохраняли только обычный набор данных, что эквивалентно попытке преобразовать стандартный набор данных в типизированный путем явного приведения, что недопустимо.

Вы можете создать метод заполнения, который принимаетв обычном наборе данных в качестве аргумента, который копирует все данные в ваш типизированный набор данных.

Это предполагает, что вы сериализуете его как стандартный набор данных.

4 голосов
/ 25 октября 2011

Как насчет использования потоков (извините, следующий код не тестировался), но вы поняли идею

 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);
...