public void UpdateDetailedInfo(bool force = false) { if (!force & RootObjects != null) return; var contentTable = _container.GetContentTable(); var metaSize = _container.Size; RootObjects = new List<RootObjectInfo>(EntriesCount); HasOldVersions = false; _container.EnableDeserializationInspection = true; _container.ObjectDeserializationStarted += OnObjectDeserializationStarted; _container.ObjectDeserializationFinished += OnObjectDeserializationFinished; foreach (var e in contentTable) { object o = null; try { _container.Deserialize(ref o, e.ObjectId, e.TypeId); } catch (Exception ex) { var refType = _container.GetTypeInfo(e.TypeId, false).Type; var invalidRoot = new RootObjectInfo(refType, e.Position, e.Length, ex.Message); RootObjects.Add(invalidRoot); continue; } if (_activeEntries.Count != 0) throw new Exception("Deserialization start calls count != end calls count"); var root = new RootObjectInfo(_rootInfo, e.ObjectId); HasOldVersions |= root.Data.HasOldVersions | root.Data.OldVersion; metaSize -= root.Data.TotalSize; RootObjects.Add(root); } _container.ObjectDeserializationStarted -= OnObjectDeserializationStarted; _container.ObjectDeserializationFinished -= OnObjectDeserializationFinished; _container.EnableDeserializationInspection = false; RootObjects.Sort((x, y) => x.Data.Id.CompareTo(y.Data.Id)); MetaInfoSize = metaSize.ToInt32(); }