为什么复制流然后使用BinaryFormatter反序列化比仅反序列化更快

Lar*_*lie 9 .net c# serialization stream deserialization

此代码大约需要8秒,其中包含来自数据库中blob的大约65K的流

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    object result = binaryFormatter.Deserialize(stream);
    return (string[])result;
}
Run Code Online (Sandbox Code Playgroud)

这段代码需要几毫秒:

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    MemoryStream memoryStream = new MemoryStream();
    Copy(stream, memoryStream);
    memoryStream.Position = 0;
    object result = binaryFormatter.Deserialize(memoryStream);
    return (string[])result;
}
Run Code Online (Sandbox Code Playgroud)

为什么?

usr*_*usr 5

所以你说当数据库被取出时,问题就消失了.这是我的理论:

BinaryFormatter以微小的增量从流中读取.它必须尽可能少地读取,以便它不会在序列化对象之后意外地吞下几个字节.这意味着它发出了大量的读命令(我用Reflector验证了这一点).

可能每次读取blob流都会导致网络往返(或其他一些主要开销).如果立即使用,这将为您提供数百万次往返BinaryFormatter.

缓冲首先使网络得到更有效的利用,因为读缓冲区的大小要大得多.