序列化和反序列化大文件

5

有没有在C#中序列化和反序列化大于10M的大文件的好方法?

提前感谢。


什么是文件?你想将它们反序列化成什么? - SLaks
二进制文件?文本?XML?您想将整个文件读入对象模型中吗? - Dirk Vollmar
1
参见:https://dev59.com/gnI-5IYBdhLWcg3wQWCc#1941970 - user195488
4个回答

1

你可以在这里查看我对于这个问题的回答(那里还有其他相关的答案)。

我的方法使用了BinaryReader和BinaryWriter以获得更好的性能。

最近我在一个项目中使用了这种方法去反序列化50MB文件,速度非常快(不到5秒),相比起内置的序列化或Xml序列化(10分钟才完成我的数据集)。


1

在序列化/反序列化小文件和大文件之间没有任何区别。您只需要确保不将非常大的文件反序列化到内存中,否则会导致OOM。

当然,处理大文件需要更多时间。如果这使您的用户界面无响应,则需要在后台线程中进行此处理。BackgroundWorker是典型的解决方案。

顺便说一句,您的问题太过模糊了。


1
如果你有非常大的文件(比如大于100MB),最好的方法是只在需要时加载必要的内容。
例如,假设你有一个拥有1万个客户及其图片的清单。将整个清单加载到内存中是没有意义的。
举个例子,你可以只加载所有姓氏和该人在文件中的位置。这样用户就可以搜索某个人,并且你也只需加载那个人的信息。
另一个可能的选择是加载前10个并向用户显示它们。当用户点击“下一页”按钮时,你可以加载下一个10个——只需计划如何组织信息即可。
与非常大的文件相比,数据库可以带来一些优势。它们可以抽象出在文件中导航所需的大量工作。
然而,“单行序列化”使用二进制格式等方法在我看来在处理那么大的文件时已经达到了极限。你需要考虑其他的概念。

1

你确定序列化/反序列化是处理如此大量数据的正确方法吗?也许像SQLite这样的客户端数据库会是更好的解决方案,你可以查询所需的确切数据,而不仅仅是将所有数据加载到内存中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接