在开发ASP.NETWeb Forms应用程序时,经常需要处理来自WCF服务的大量DataTable对象,并且这些对象需要在用户界面(UI)上进行直接绑定。虽然这种做法可能不是最优的,但由于UI的复杂性和业务逻辑直接引用了大量的DataTable字段,重写这部分代码的成本和风险都非常高。因此,寻求一种最佳的DataTable序列化方法。
本文将介绍几种不同的序列化方法,并比较它们在性能和一致性方面的表现。所有的测试都是在一台配置为Windows 10 Pro x64、Intel Core i3 540 @ 3.06 Ghz CPU和8 GB的DDR3 RAM @ 1333 Mhz的计算机上进行的。
以下是测试的几种序列化方法:
对每种序列化方法进行了多次测试,以确保结果的一致性和准确性。测试对象包括人工生成的DataTable对象和从AdventureWorks2012 SQL Server示例数据库的生产模式中检索到的对象。
以下是对一个包含36列和10,000行(总共360,000个单元格)的大型数据集进行序列化和反序列化的测试结果:
描述 | 大小 (字节) | 序列化 (毫秒) | 反序列化 (毫秒) |
---|---|---|---|
DataTableWriteXml/ReadXml 方法 | 13,435,801 | 411.941 ± 4.932 | 467.279 ± 3.059 |
二进制格式化器 | 2,660,024 | 217.003 ± 1.254 | 317.036 ± 6.738 |
压缩二进制格式化器 | 821,369 | 232.951 ± 1.044 | 323.181 ± 2.818 |
协议缓冲区 | 失败 | 失败 | 失败 |
快速序列化器 | 1,696,752 | 74.906 ± 0.782 | 106.662 ± 0.925 |
轻量级序列化器 | 3,324,311 | 339.926 ± 8.636 | 700.616 ± 8.806 |
Drew DataSet格式化器 | 3,182,058 | 376.337 ± 1.704 | 668.623 ± 10.188 |
自定义DataTable格式化器 | 535,194 | 60.743 ± 0.264 | 127.290 ± 0.929 |
从测试结果可以看出,自定义DataTable格式化器在序列化和反序列化大型数据集时表现最好,无论是在大小、序列化时间还是反序列化时间上都优于其他方法。
以下是对一个包含4列和10行(总共40个单元格)的小型数据集进行序列化和反序列化的测试结果:
描述 | 大小 (字节) | 序列化 (毫秒) | 反序列化 (毫秒) |
---|---|---|---|
DataTableWriteXml/ReadXml 方法 | 3,707 | 0.116 ± 0.000 | 0.286 ± 0.001 |
二进制格式化器 | 7,609 | 0.272 ± 0.000 | 0.361 ± 0.000 |
压缩二进制格式化器 | 3,549 | 0.367 ± 0.021 | 0.414 ± 0.010 |
协议缓冲区 | 1,354 | 0.068 ± 0.000 | 0.145 ± 0.001 |
快速序列化器 | 1,420 | 0.017 ± 0.000 | 0.036 ± 0.000 |
轻量级序列化器 | 2,559 | 0.127 ± 0.000 | 0.274 ± 0.002 |
Drew DataSet格式化器 | 2,192 | 0.060 ± 0.000 | 0.132 ± 0.000 |
自定义DataTable格式化器 | 1,436 | 0.025 ± 0.000 | 0.050 ± 0.000 |
在小型数据集的测试中,快速序列化器在序列化和反序列化时间上表现最好,而自定义DataTable格式化器在大小上表现最好。