private static void UpdateSerializationSystems() { if (!_isDirty) { return; } _assemblyLoader.OnAssemblyLoaded -= SetDirty; Dictionary <Type, List <Pair> > candidates = new Dictionary <Type, List <Pair> >(); var searchSet = new Queue <Assembly>(_assemblyLoader.GetAssemblies()); var foundSet = new HashSet <Assembly>(); Action <Assembly> onAssemblyLoaded = a => { if (foundSet.Contains(a)) { return; } searchSet.Enqueue(a); }; _assemblyLoader.OnAssemblyLoaded += onAssemblyLoaded; while (searchSet.Count > 0) { var ass = searchSet.Dequeue(); foundSet.Add(ass); foreach (var type in TypeTools.GetAllTypes(ass).Where(t => !(t.IsAbstract() || t.IsInterface()))) { var key = _validTypes.FirstOrDefault(i => TypeTools.IsAssignableFrom(i, type)); if (key == null) { continue; } var att = type.GetTypeAttributes <DefaultSerializationSystemAttribute>(false).FirstOrDefault(); if (att == null) { continue; } List <Pair> set; if (!candidates.TryGetValue(key, out set)) { set = new List <Pair>(); candidates[key] = set; } set.Add(Tuples.Create(att, type)); } } _assemblyLoader.OnAssemblyLoaded -= onAssemblyLoaded; RecalcTypeTrees(_surrogateSelector, candidates); RecalcTypeTrees(_formatterSelector, candidates); _assemblyLoader.OnAssemblyLoaded += SetDirty; _isDirty = false; }