C# - XML反序列化 vs 二进制反序列化 vs 二进制+压缩反序列化

3
我正在将一个巨大的对象列表保存到文件中,并稍后对它们进行反序列化。生成的XML文件大小可能达到3GB。
我希望反序列化速度超快,因此我尝试了三种方法(XML、二进制、压缩)。
显然,解压缩文件的反序列化比XML文件慢得多。但是我发现二进制反序列化也比XML反序列化花费更多时间。这正常吗?难道XML和二进制反序列化不应该花费相同的时间来反序列化对象吗?
另外,您认为在文件大小和反序列化速度之间取得良好平衡的最佳选项是什么?
2个回答

5
这个性能比较 中,涵盖了.NET带有的各种序列化方法(BinaryFormatter、XmlSerializer、DataContractSerializer等)以及protobuf,其中protobuf序列化器似乎要比.NET自带的序列化器更加先进。结果尺寸看起来也更小。如果protobuf格式对您可行,我强烈建议您考虑使用它。 :-)
另一种选择是:如果反序列化速度慢,请只反序列化您真正需要的部分。创建一个索引文件,告诉您写入数据文件对象的偏移量,这样您就可以以随机访问的方式快速反序列化所需的对象。

谢谢,我试了protobuf,真是太棒了...它大大缩短了时间。 - ace

1

自定义序列化,可以完全自定义或实现ISerializable接口,然后使用二进制(尽管自定义XML也值得尝试)。不要序列化记忆化字段,而只是基于其值的键字段。寻找其他可以通过序列化足够信息来构建图的一部分而不是完整表示图形的区域来减小大小的方法。

然后使用deflate压缩。


嘿Jon...是的,我在考虑实现ISerializable,但后来尝试了protobuf...现在我想知道是否可以在使用protobuf的同时进一步定制我的序列化。不确定是否可以使用protobuf并仍然获得ISerializable的好处? - ace

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