【问题标题】:serializing a datatable for later reuse序列化数据表以供以后重用
【发布时间】:2011-01-04 10:03:52
【问题描述】:

我有一个已填充的 DataTable,我想将其序列化为一个文件以供以后使用。我一直在研究与此相关的选项,并想知道是否有人可以为我指明正确的方向。

我将创建两种方法——一种用于将数据表写入文件,另一种用于使用文件作为输入创建新的数据表。使用 WriteXML() 和 Load() 方法来执行此操作是否有意义,如果是,哪些标志是需要关注的?感谢您的指导。

如果有帮助,我正在使用 .Net 2.0。

【问题讨论】:

    标签: c# .net xml-serialization datatable


    【解决方案1】:

    重要提示:
    如果您尝试使用二进制格式化程序序列化DataTable 对象或DataSet 对象,您仍然会得到一个二进制文件,但它是一个相当大的文件,因为它充满了大量的 XML 数据。不幸的是,二进制文件中的 XML 数据会产生巨大的文件,缺乏 XML 提供的可移植性和可读性优势。随后,反序列化此类文件可能需要几秒钟才能完成,并最终占用比实际需要更多的内存。因此,如果因为需要获得更紧凑的输出而选择 ADO.NET 对象的二进制序列化,您将失败。二进制序列化仍然是最节省空间的方法,但对于 ADO.NET 对象,它并没有被证明是应有的效率。

    如需完整参考,请阅读以下文章:-
    http://msdn.microsoft.com/en-us/magazine/cc188907.aspx

    【讨论】:

    • 虽然这是一个很好的评论,但它并不能真正回答问题,+链接已失效。
    【解决方案2】:

    我认为 Silveira comment 的意思是使用二进制序列化。它的正确之处在于它与 XML 相比非常快,而 XML 与专门针对大量数据的二进制文件相比,序列化非常慢。与 XML 相比,它占用的磁盘空间也少得多。

        public static void Serialize(DataSet ds, Stream stream) {
            BinaryFormatter serializer = new BinaryFormatter();
            serializer.Serialize(stream, ds);
        }
    
        public static DataSet Deserialize(Stream stream) {
            BinaryFormatter serializer = new BinaryFormatter();
            return (DataSet)serializer.Deserialize(stream);
        } 
    

    【讨论】:

    • 使用二进制序列化的缺点之一是二进制序列化包含已序列化类型的程序集限定名称,因此如果 System.Data.dll 发生更改,您将无法从二进制文件中读取数据。但是由于名称空间中的 DataSet 和其他类是框架的一部分,并且不喜欢更改,因此我认为在这种情况下没有任何问题。
    • 我通常只需要序列化少量数据,所以 XMLSerializer 很好。但这里的底线是,我们似乎都同意序列化是一个很好的前进方向。可以根据其他要求选择正确的格式化程序(XML、Binary、DataContract)(例如,如果您只需在应用程序中读取数据,而不需要将其导出到其他环境,Binary 似乎是完美的选择) .
    • DataSet 和 DataTable 默认转换为 XML,无论使用什么格式化程序(请参阅msdn.microsoft.com/en-us/magazine/cc163911.aspx)。它们都有一个名为“RemotingFormat”的属性,如果要减小序列化对象的大小,则需要将其设置为“SerializationFormat.Binary”。
    【解决方案3】:

    数据表是内存中的对象吗?如果是这样,您可以简单地使用序列化和反序列化方法。它们的速度相对较快,您可以在任何地方保留结果。

    【讨论】:

    • 你指的是SerializeDeserialize这两个方法?
    • 您可以使用 System.Xml.Serialization.XmlSerializer 类中的方法。我现在在客户那里,但是当我有时间时,我会尝试获取我拥有的示例。它们使用起来非常简单。
    • 嗨,是的,DataTable 在内存中。我很想看到你的代码 sn-p,因为现在我正在使用 ReadXml() 和 WriteXml()。谢谢!
    【解决方案4】:

    我会选择读/写 xml 方法。我们非常广泛地使用它。它快速、简单,内置于框架中。

    【讨论】:

    • 我认为如果您包含代码示例,这个答案会好很多。您可能知道如何使用 Read/Write XML 方法,问题的作者也可能知道,但请记住,此站点不仅仅是获取我们自己问题的答案。这是关于为遇到问题的其他人记录它们。遇到此问题的其他用户可能不知道如何使用这些方法。
    【解决方案5】:

    您可以使用将数据库序列化为带有标题的 CSV 文件的基本技术。一些数据库管理系统支持从此类文件轻松加载数据。如果您的 dbms 没有,编写一些代码来为您执行此操作不会太困难。这能回答你的问题吗?

    在我看来,xml 的缺点是它包含的元数据可能比实际数据多。如果是 csv 文件,元数据不重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多