DeSerialize DataTable Набор строк в список <T> - PullRequest
1 голос
/ 09 октября 2009

У меня есть DataTable со строками данных. У меня есть класс со свойствами, которые соответствуют именам столбцов строк.

Как мне получить список, который заполняется из строки данных DataTable?

Должен ли я вызывать что-то вроде (MyType) нового XmlSerializer (typeof (MyType)). Десериализовать (новый XMLReader (Table.WriteXML ()));

Ответы [ 2 ]

2 голосов
/ 09 октября 2009

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

С другой стороны, иногда вам просто нужно десериализовать коллекции из XML. Для этого все, что вам нужно сделать, это указать XmlSerializer , какой узел сопоставить с коллекцией .

По умолчанию DataTable.WriteXml создает корневой элемент с именем <DocumentElement>. Например, если вы пишете из DataTable с именем «Name», которое имеет столбцы «FirstName» и «LastName», вы получите следующее:

<DocumentElement>
    <Name>
        <FirstName>Jon</FirstName>
        <LastName>User</LastName>
    </Name>
</DocumentElement>

Проблема в том, что XmlSerializer не знает, что DocumentElement должен быть десериализован в ваш класс коллекции. Есть два способа сказать, как это сделать.

По соглашению

XmlSerializer знает, что корневой элемент с именем "ArrayOfMyClass" должен отображаться в коллекции MyClass.

Добавьте ваш DataTable к DataSet с именем "ArrayOfMyClass", чтобы сериализовать его следующим образом ...

<ArrayOfMyClass>
    <MyClass>
    // ... elements that map to properties of MyClass
    </MyClass>
</ArrayOfMyClass>

.... который десериализуется в List<MyClass> по желанию.

От руки

В качестве альтернативы вы можете сделать это так:

XmlRootAttribute root       = new XmlRootAttribute("DocumentElement");
XmlSerializer    serializer = new XmlSerializer(typeof(List<Name>), root);

Если предположить, что все остальное в порядке (то есть имена столбцов строк данных соответствуют именам свойств вашего класса), это будет десериализовано, как и ожидалось, в ваш List<MyClass>.

Редактировать: обратите внимание, что этот подход имеет довольно серьезную проблему (с умеренно громоздким обходным путем), описанную в этом вопросе SO: Проблема производительности XmlSerializer .

1 голос
/ 09 октября 2009

Если я правильно понимаю ваш вопрос, вы хотите поместить поля каждой строки данных в экземпляры YourClass, а затем сохранить их в списке?

В этом случае самый простой способ -

create the List object
loop over the rows
   create a new YourClass object
   map the fields to the properties of the YourClass object
   add the YourClass object to the list
...