У меня есть 2 строго типизированных набора данных. Мне нужно сохранить содержащиеся данные в один файл (и, конечно, иметь возможность читать и загружать их обратно в наборы данных позже). Обычно я использую метод DataSet.WriteXml() для сохранения данных в виде текста и DataSet.ReadXml() для его чтения, когда у меня есть один набор данных.
Первая идея, которая приходит в голову, - сохранить каждый набор данных в потоке памяти, затем преобразовать потоки в байтовые массивы, а затем записать байты в файл.
Но эта идея кажется мне не очень изящной и не самой лучшей, поэтому я подумал, есть ли лучший способ сделать это.
Любые идеи? (Закодированные ответы были бы полезнее)
У меня есть приложение WinForms. Мои наборы данных представляют собой файл. Допустим, это требование.
Связаны ли эти два набора данных друг с другом? Связанные, например, у них обоих есть ключ, который может быть связан друг с другом, первичный ключ и внешний ключ?
Если у вас есть доступ к MS Excel, вы можете экспортировать наборы данных в файл Excel, и каждая таблица данных в наборе будет иметь свой собственный рабочий лист. Это поможет сохранить структуру таблицы. Вы также можете прочитать из файла Excel. - Это может быть для вас жизнеспособным?
К сожалению, похоже, что сериализаторы Xml не обрабатывают несколько объектов в одном файле. К счастью, двоичные сериализаторы умеют - см. эта статья.





Класс DataSet имеет Метод слияния. Это предназначено для объектов набора данных, схемы которых похожи / связаны и будут объединять их вместе. Есть много параметров, которые могут управлять тем, как вы хотите, чтобы это слияние работало.
Пример слияния
dataset1.Merge(dataset2,true); //true will preserve changes in dataset1 if dataset2 has matching/related data that is different
У нас не так много работы, но, судя по вашему вопросу, кажется, что Merge, похоже, не соответствует вашим потребностям (отсюда и мой вопрос в комментариях), плюс непонимание, почему нужен один файл xml и / или как создаются исходные наборы данных (например, из двух внешних XML-файлов, находящихся вне вашего контроля, или ....).
Идея 2
Если оба набора данных представляют собой нечто совершенно другое, добавьте в один из наборов данных таблицы из другого и затем сохраните. Когда вы перечитаете его, вы затем отмените процесс, чтобы разделить таблицы на второй набор данных.
Пример добавления таблиц
dataset1.Tables.Add(dataset2.Tables["tablename"]);
Возвращение к двум наборам данных после чтения xml с опцией Tables будет выглядеть примерно так:
foreach(DataTable table in dataset1)
{
if (table.TableName == "TableForDataset2")
{
dataset2.Tables.Add(table);
}
}
Вот тестовый код, который я написал с LINQPad, чтобы использовать BinaryFormatter для нескольких DataSet:
var fsw = new FileStream(@"D:\testdataset.ser", FileMode.Create);
var b = new BinaryFormatter();
b.Serialize(fsw,ds);
b.Serialize(fsw,ds2);
fsw.Close();
var fsr = new FileStream(@"D:\testdataset.ser", FileMode.Open);
var rds = (DataSet)b.Deserialize(fsr);
var rds2 = (DataSet)b.Deserialize(fsr);
fsr.Close();
Существует множество движков баз данных на основе файлов. Почему бы не использовать один из них для хранения реляционных данных в файле?