2016-03-02 4 views
0

Я пытаюсь сериализовать DataSet в файл XML. Как видно из вывода выборки, все мои таблицы имеют имена и набор данных также назван. Пространство имен набора данных «", изменение этого не имеет никакого эффекта. Исключение составляет:Ошибка сериализации DataSet в XML

Невозможно сериализовать DataTable. Имя DataTable не задано.

Как вы можете видеть ниже достаточно четко, все таблицы были названы.

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

Не можете сериализовать DataTable. Имя DataTable не задано.

Вот код, я использую для сериализации набора данных:

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

если XmlWriteMode является WriteSchema файл XML создается и заполняется со схемой, исключение еще брошен. Если XmlWriteMode - IgnoreSchema, и создается пустой файл и генерируется исключение.

В чем причина этой проблемы? Я проехал через множество сообщений здесь и в других местах в Интернете, и все говорят «задайте имя таблицы». Я сделал это, но это не имеет значения.

+0

Прошлое db.xml. Нет всех строк, только некоторые данные. –

+0

Проблема, вероятно, в коде, в котором вы создаете свой набор данных, вы должны предоставить этот код или образец (макет), который генерирует ту же ошибку. – cnom

+1

Я думаю, что я понял, в чем проблема. Данные десериализуются из JSON в набор данных с использованием JSON.NET. Один из столбцов в некоторых таблицах имеет тип DataTable. Я думаю, что это те столбцы, которые сериализатор не знает, как обращаться. Имеет ли это смысл? – user3081814

ответ

1

Исходя из комментариев, проблема связана с тем, что некоторые таблицы в наборе данных не имеют имени. это, вероятно, вторичные таблицы (элементы таблицы внутри Table1, Table2 и т. д.).

Решение может быть Итерация через все объекты в наборе данных и, если тип DataTable задает общее имя.

+0

Спасибо за ввод. Это именно то, что мне нужно. – user3081814

+0

Добро пожаловать, я бы предоставил код фрагмента, чтобы сделать итерацию, чтобы помочь вам, но теперь я вижу, что вы сделали это уже. Приятно, я вас поддержал ;-) – cnom

0

Это решение, которое я использовал, и оно работает. Вероятно, не самый эффективный, но 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; 
       } 
      } 
     } 
    }