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)
为什么?
所以你说当数据库被取出时,问题就消失了.这是我的理论:
BinaryFormatter以微小的增量从流中读取.它必须尽可能少地读取,以便它不会在序列化对象之后意外地吞下几个字节.这意味着它发出了大量的读命令(我用Reflector验证了这一点).
可能每次读取blob流都会导致网络往返(或其他一些主要开销).如果立即使用,这将为您提供数百万次往返BinaryFormatter.
缓冲首先使网络得到更有效的利用,因为读缓冲区的大小要大得多.