首先由於該方法用LinkDemand檢查SecurityPermissionAttribute.SerializationFormatter許可權,因此部分受信任環境下可能無法使用。該方法相比Deserialize方法有更好的效能。
代碼:
//+ using System.Runtime.Serialization.Formatters.Binary
//+ using System.IO;
//建立一個100個元素的字典
var dic = new Dictionary<int, string>();
for (int i = 0; i < 100; i++)
dic.Add(i, i.ToString());
//序列化到檔案
var bf = new BinaryFormatter();
var stream = new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite);
bf.Serialize(stream, dic);
stream.Seek(0, SeekOrigin.Begin);
//使用Deserialize進行還原序列化
var stopWatch = Stopwatch.StartNew();
bf.Deserialize(stream);
Console.WriteLine(stopWatch.Elapsed);
//使用UnsafeDeserialize進行還原序列化
stream.Seek(0, SeekOrigin.Begin);
stopWatch.Restart();
bf.UnsafeDeserialize(stream, null);
Console.WriteLine(stopWatch.Elapsed);
UnsafeDeserialize的效能提升和序列化對象本身的結構和大小有關係。
比如樣本中的100個元素的字典結果:
00:00:00.0015032
00:00:00.0004704
10個元素效能差異更大:
00:00:00.0010952
00:00:00.0001489
而1000個元素的話差異並不是很大:
00:00:00.0045790
00:00:00.0036886