将DataTable行集合DeSerialize到List <t> </t>

时间:2009-10-09 12:06:46

标签: c# linq c#-3.0 xml-serialization linq-to-xml

我有一个包含数据行的DataTable。我有一个类,其属性与行列名匹配。

如何从DataTable Row信息中填充List?

我是否调用类似(MyType)的新XmlSerializer(typeof(MyType))。反序列化(new XMLReader(Table.WriteXML()));

2 个答案:

答案 0 :(得分:2)

我建议编写类来执行此转换,而不是使用XML序列化,这需要大量额外的工作,并且将对象与数据模型紧密联系在一起。

另一方面,有时您只需要从XML反序列化集合。要做到这一点,您需要做的就是告诉 XmlSerializer 将哪个节点映射到集合

默认情况下,DataTable.WriteXml会创建一个名为<DocumentElement>的根元素。例如,如果您从名为“名称”的DataTable写入“FirstName”和“LastName”列,您将得到:

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

问题是XmlSerializer不知道应该将“DocumentElement”反序列化到您的集合类。有两种方法可以告诉它如何。

按惯例

XmlSerializer知道名为“ArrayOfMyClass”的根元素应该映射到MyClass的集合。

将您的DataTable添加到名为“ArrayOfMyClass”的DataSet中,将其序列化为此...

<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 Performance Issue

答案 1 :(得分:1)

如果我正确理解您的问题,您想将每行数据的字段放入YourClass的实例中,然后将实例存储在List中吗?

在这种情况下,最直接的方法是

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