Welcome

首页 / 软件开发 / .NET编程技术 / .NET陷阱 一 IDeserializationCallback带来的问题

.NET陷阱 一 IDeserializationCallback带来的问题2013-05-21代码中有一个类,其中包含一个字典(Dictionary<Key, Value>),本来想让前者实现IDeserializationCallback接口,以便在反序列化时根据字典的内容做一些初始化工作,结果循环字典元素的代码就是不走。费了好大劲才找到原因,先来看有问题的代码:

using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;namespace DotNetBugs{[Serializable]public class Example : IDeserializationCallback{private Dictionary<string, string> map = new Dictionary<string, string>();public Example(){map.Add("one", "1");map.Add("two", "2");}public void OnDeserialization(object sender){Dump();}public void Dump(){foreach (var item in map){Console.WriteLine(item.Key + " -> " + item.Value);}}}public class Starter{public static void Main(string[] args){using (var stream = new MemoryStream()){var formatter = new BinaryFormatter();formatter.Serialize(stream, new Example());stream.Seek(0, SeekOrigin.Begin);var example = (Example)formatter.Deserialize(stream);Console.WriteLine("after deserialize");example.Dump();Console.Read();}}}}
你期望控制台有什么样的输出呢,是不是这样?

one -> 1 | two -> 2 | 在第44行反序列化时,Example.OnDeserialization中调用Dump的输出。 after deserialize one -> 1 | two -> 2 | 在第47行调用Dump的输出
但实际的输出内容是:

after deserialize one -> 1 two -> 2