DateTime 数组的二进制序列化

Posted

技术标签:

【中文标题】DateTime 数组的二进制序列化【英文标题】:Binary Serialization of an Array of DateTime 【发布时间】:2010-10-29 17:31:18 【问题描述】:

当我使用 BinaryFormatter 序列化 Int32 数组时,我得到大约 400MB/s(一秒内 1 亿个项目),但是当我尝试序列化 DateTime 数组时,我只得到大约 27MB/s 的吞吐量(30 秒内 1 亿个项目)。一个 DateTime 以序列化形式占用 8 个字节。我猜 BinaryFormatter 使用 ISerializable 接口,如果它实现了,所以我看了一下 DateTime 类型的 GetObjectData 实现:

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)

    if (info == null)
    
        throw new ArgumentNullException("info");
    
    info.AddValue("ticks", this.InternalTicks);
    info.AddValue("dateData", this.dateData);

我很困惑将 UInt64 和 Int64 添加到输出中,总和应该是 16 个字节,但这并不反映我的措施。那么 DateTime 是如何真正序列化为二进制的呢?

【问题讨论】:

【参考方案1】:

听起来您的 int 序列化受 I/O 限制,但您的 DateTime 序列化受 CPU 限制(显然,序列化 DateTime 比序列化 int 需要更多的 CPU 时间)。因此,您的测量值不会反映您的两种数据类型大小之间的确切比率。

【讨论】:

测量是通过序列化到 MemoryStream 来完成的,所以没有 I/O。 好的,所以你没有 I/O 限制,但是序列化 DateTime 显然比 int 长 30 倍。【参考方案2】:

它会超过 16 个字节,因为它也需要存储密钥。

您可以自己(直接)序列化刻度吗?或者;我没有在这个场景下测试过,但是你可以试一试protobuf-net(它是一个高性能的二进制序列化引擎)。

【讨论】:

1 亿个 DateTimes 给了我大约 800MB 的流长度,所以 BinaryFormatter 似乎存储了一些类似刻度的东西,但不幸的是,速度很慢。

以上是关于DateTime 数组的二进制序列化的主要内容,如果未能解决你的问题,请参考以下文章

如何“连接”或“组合”或“加入”一系列“二进制”序列化字节数组? [复制]

Java序列化机制原理

python时间序列中的二进制数组

TypeError: datetime.datetime() 不是 JSON 可序列化的

datetime.datetime 不是 JSON 可序列化的 [重复]

json序列化datetime类型数据