【发布时间】:2009-12-23 16:03:11
【问题描述】:
有没有什么好的方法可以在c#中对大文件(>10M)进行序列化和反序列化。
提前致谢。
【问题讨论】:
-
文件是什么?你想将它们反序列化成什么?
-
二进制文件?文本? XML?是否要将整个文件读入对象模型?
标签: c# serialization
有没有什么好的方法可以在c#中对大文件(>10M)进行序列化和反序列化。
提前致谢。
【问题讨论】:
标签: c# serialization
对小文件或大文件进行反序列化/序列化没有任何区别。您只需要确保不会将非常大的文件反序列化到内存中,否则会导致 OOM。
当然,大文件需要更多时间。如果这使您的用户界面无响应,那么您将希望在后台线程中进行此处理。 BackgroundWorker 是一个典型的解决方案。
顺便说一句,这里在黑暗中随机拍摄,你的问题太模糊了。
【讨论】:
你可以查看我对这个问题的回答here(那里也有各种其他相关的答案)。
我的方法使用 BinaryReader 和 BinaryWriter 来提高性能。
我在最近的一个项目中使用这种方法反序列化了 50MB 的文件,与内置序列化或 Xml 序列化(我的数据集需要 10 分钟)相比,它的反序列化速度非常快(不到 5 秒)。
【讨论】:
您确定序列化/反序列化是处理这么多数据的正确方法吗?也许像 SQLite 这样的客户端数据库会是更好的解决方案,您可以在其中查询所需的确切数据,而不仅仅是将所有内容加载到内存中?
【讨论】:
如果您确实有大文件(假设大于 100 MB),最好只加载您目前需要的内容。
假设您有一个包含 10.000 位客户的列表 - 每个客户都有一张图片。将此列表保留在内存中是没有意义的。
例如,您可以加载文件中的所有姓氏和人的位置。所以用户可以搜索一个人,你可以准确地加载那个人。
另一种可能性是加载前十个并将它们显示给用户。只要他点击“下一步”按钮,您就可以加载接下来的十个 - 只需计划如何组织信息。
数据库可以带来一些优势,而不是非常大的文件。他们可以抽象出在文件中导航所需的大量工作。
在我看来,使用 BinaryFormatter 等的“单行序列化”在这种大小的文件中达到了极限。您必须考虑其他概念。
【讨论】: