当前位置:
首页 > Python基础教程 >
-
C#教程之[.NET]使用十年股价对比各种序列化技术(2)
)) { bytes = new byte[sizeof(int)]; stream.Read(bytes, 0, bytes.Length); value = BitConverter.ToInt32(bytes, 0); } else if (property.PropertyType == typeof(short)) { bytes = new byte[sizeof(short)]; stream.Read(bytes, 0, bytes.Length); value = BitConverter.ToInt16(bytes, 0); } else if (property.PropertyType == typeof(float)) { bytes = new byte[sizeof(float)]; stream.Read(bytes, 0, bytes.Length); value = BitConverter.ToSingle(bytes, 0); } else if (property.PropertyType == typeof(double)) { bytes = new byte[sizeof(double)]; stream.Read(bytes, 0, bytes.Length); value = BitConverter.ToDouble(bytes, 0); } property.SetValue(price, value); index += bytes.Length; } result.Add(price); } return result; } }
Name | Serialize(ms) | Deserialize(ms) | Bytes |
---|---|---|---|
ReflectionSerializer | 413 | 431 | 103,246 |
好像好了一些,但性能大幅下降。我好像记得有人说过.NET会将反射缓存让我不必担心反射带来的性能问题,看来我的理解有出入。索性自己缓存些反射结果:
private readonly IEnumerable<PropertyInfo> _properties; public ExtendReflectionSerializer() { _properties = typeof(StockPriceSlim).GetProperties().Where(p => p.GetCustomAttribute(typeof(DataMemberAttribute)) != null).ToList(); }
Name | Serialize(ms) | Deserialize(ms) | Bytes |
---|---|---|---|
ExtendReflectionSerializer | 11 | 11 | 103,246 |
这样改进后性能还可以接受。
6. 最后试试压缩#
最后试试在序列化的基础上再随便压缩一下:
public byte[] SerializeWithZip(List<StockPriceSlim> instance) { var bytes = SerializeSlim(instance); using (var memoryStream = new MemoryStream()) { using (var deflateStream = new DeflateStream(memoryStream, CompressionLevel.Fastest)) { deflateStream.Write(bytes, 0, bytes.Length); } return memoryStream.ToArray(); } } public List<StockPriceSlim> DeserializeWithZip(byte[] source) { using (var originalFileStream = new MemoryStream(source)) { using (var memoryStream = new MemoryStream()) { using (var decompressionStream = new DeflateStream(originalFileStream, CompressionMode.Decompress)) { decompressionStream.CopyTo(memoryStream); } var bytes = memoryStream.ToArray(); return DeserializeSlim(bytes); } } }
结果看来不错:
Name | Serialize(ms) | Deserialize(ms) | Bytes | Serialize With Zip(ms) | Deserialize With Zip(ms) | Bytes With Zip |
---|---|---|---|---|---|---|
BinarySerializer | 11 | 12 | 141,930 | 22 | 12 | 72,954 |
XmlSerializer | 42 | 24 | 977,248 | 24 | 28 | 108,839 |
SoapSerializer | 48 | 89 | 2,586,720 | 61 | 87 | 140,391 |
JsonSerializer | 17 | 33 | 411,942 | 24 | 35 | 90,125 |
ProtobufSerializer | 7 | 3 | 130,416 | 7 | 6 | 65,644 |
CustomSerializer | 5 | 1 | 103,246 | 9 | 3 | 57,697 |
ReflectionSerializer | 413 | 431 | 103,246 | 401 | 376 | 59,285 |
ExtendReflectionSerializer | 11 | 11 | 103,246 | 13 | 14 | 59,285 |
7. 结语#
满足了好奇心,顺便复习了一下各种序列化的方式。
因为原来的需求就很单一,没有测试各种数据量下的对比。
虽然Protobuf十分优秀,但在本地存储序列化文件时为了可读性我通常都会选择XML或JSON。
8. 参考#
二进制序列化 XML 和 SOAP 序列化 Json.NET Protocol Buffers - Google's data interchange format
9. 源码#
StockDataSample
作者:Dino.C
出处:https://www.cnblogs.com/dino623/p/Serialize.html
本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式