【问题标题】:How to serialize a DataTable to a string?如何将 DataTable 序列化为字符串?
【发布时间】:2011-01-15 17:22:28
【问题描述】:

最近我需要将DataTable 序列化为字符串以进行进一步处理(存储在文件中)。

于是我问自己:如何将DataTable序列化成字符串?

【问题讨论】:

  • -1:使用XmlWriter.Create 而不是new XmlTextWriter()
  • @Uwe Keim:是的,可以发布代码 sn-ps,但仍应遵循网站的问答格式。您关于序列化数据表的问题很好,但代码 sn-p 应作为答案单独发布。这将遵循问答指南,并鼓励其他人发布自己的答案。
  • 我现在应该改变它吗,比尔?或者在我下次发布时注意指南?
  • @Uwe Keirn - 我会将问题更改为阅读如何序列化表格,然后将您的代码作为答案之一发布。可能有更好或更有趣的解决方案可供您学习。
  • 完成。感谢您的回复!

标签: .net string datatable serialization


【解决方案1】:

这是我编写的代码,用于执行将DataTable 序列化为字符串的任务:

public static string SerializeTableToString( DataTable table )
{
    if (table == null)
    {
        return null;
    }
    else
    {
        using (var sw = new StringWriter())
        using (var tw = new XmlTextWriter(sw))
        {
            // Must set name for serialization to succeed.
            table.TableName = @"MyTable";

            // --

            tw.Formatting = Formatting.Indented;

            tw.WriteStartDocument();
            tw.WriteStartElement(@"data");

            ((IXmlSerializable)table).WriteXml(tw);

            tw.WriteEndElement();
            tw.WriteEndDocument();

            // --

            tw.Flush();
            tw.Close();
            sw.Flush();

            return sw.ToString();
        }
    }
}

希望这对外面的某个人有用。

(请注意我 asked in the past 是否可以发布 sn-ps 并得到回复说这应该可以;如果我错了,请纠正我 - 谢谢!) p>

【讨论】:

  • 为什么不把它塞进数据集中,然后保存呢?应该不超过 2-3 行...
  • 这是我首先尝试的。令我惊讶的是,DataTable 的 DataSet 引用为 NULL,所以我使用了这个解决方案。
  • 这会是什么反面?当我尝试将 xml 读回 DataTable 时,调用此命令时出现“XML 文档 (0, 0) 中存在错误”错误:XmlSerializer serializer = new XmlSerializer(typeof(DataTable)); FileStream file = new FileStream(filename, FileMode.Open); DataTable retval = (DataTable)serializer.Deserialize(file);返回 retval;
【解决方案2】:

您也可以尝试将 DataTable 写入 XML,效果也很好:

Dim dt As DataTable
Dim DataTableAsXMLString As String
'...code to populate DataTable
Using sw As New StringWriter()       
    dt.WriteXml(sw)
    DataTableAsXMLString = sw.ToString()
End Using

...如果需要,您可以将 XML 直接转换回 DataTable:

Dim ds As New DataSet
Dim dt2 As DataTable
Using sr As New StringReader(DataTableAsXMLString)
    ds.ReadXml(sr)
    dt2 = ds.Tables(0)
End Using

【讨论】:

  • 感谢您也发布反向过程。
  • 确保在调用 dt.WriteXml(sw) 之前还为数据表命名 (dt.tableName = "MyDataTable"),否则会出现异常。
  • 代码错误。 dt.WriteXml(sw) 不返回字符串。您需要拨打dt.WriteXml(sw),然后拨打DataTableAsXMLString = sw.ToString()
  • 我修改了答案,将一次性物品包装在 using 块中,否则您可能会看到您的内存使用量以惊人的速度攀升
  • 还根据@nunzabar cmets 修复了答案
【解决方案3】:

您也可以这样做。

DataTable dt = new DataTable()  
//... Fill Datatable from SQL or a thousand other places you have seen on the net.     
Response.ContentType = "text/xml";    
dt.WriteXml(Response.OutputStream);  
Response.Flush();
Response.End();

文档位于

http://msdn.microsoft.com/en-us/library/system.data.datatable.writexml(v=VS.100).aspx

【讨论】:

    【解决方案4】:

    我建议不要序列化 ​​DataTable 并使用自定义实体进行持久性/合同以避免difference in implementation details between .Net versions。 DataTable 类的 XML 模式是您不应该依赖的未记录的实现细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2022-11-15
      • 2020-05-20
      • 2019-10-25
      • 2016-01-22
      相关资源
      最近更新 更多