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();
 }