public object CacheCatalog(ComposablePartCatalogCacheWriter writer)
        {
            ThrowIfDisposed();

            Requires.NotNull(writer, "writer");

            List<object> subordinateCacheTokens = new List<object>();
            foreach (ComposablePartCatalog catalog in this.Catalogs)
            {
                ICachedComposablePartCatalog cachedCatalog = catalog as ICachedComposablePartCatalog;
                if (cachedCatalog == null)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, Strings.CatalogIsNotCacheable, catalog.GetType()));
                }
                object subordinateCacheToken = cachedCatalog.CacheCatalog(writer);
                subordinateCacheTokens.Add(subordinateCacheToken);
            }

            IDictionary<string, object> metadata = new Dictionary<string, object>();
            metadata.WriteEnumerable(AttributedCacheServices.CacheKeys.SubordinateTokens, subordinateCacheTokens);

            object cacheToken = writer.WriteCache(
                this.GetType(),
                null,
                metadata,
                null);

            writer.WriteRootCacheToken(cacheToken);
            return cacheToken;
        }
        public object CacheCatalog(ComposablePartCatalogCacheWriter writer)
        {
            this.ThrowIfDisposed();

            Requires.NotNull(writer, "writer");

            object cacheToken = writer.WriteCache(
                this.GetType(),
                this.Parts,
                null,
                AttributedComposablePartCatalogSite.CreateForWriting());

            writer.WriteRootCacheToken(cacheToken);
            return cacheToken;
        }
        public object CacheCatalog(ComposablePartCatalogCacheWriter writer)
        {
            this.ThrowIfDisposed();

            Requires.NotNull(writer, "writer");

            IDictionary<string, object> metadata;
            if (this._isCached)
            {
                Assumes.NotNull(this._cacheCatalogMetadata);
                metadata = this._cacheCatalogMetadata;
            }
            else
            {
                AssemblyCatalog assemblyCatalog = this._innerCatalog as AssemblyCatalog;
                Assumes.NotNull(assemblyCatalog);
                metadata = new Dictionary<string, object>();
                metadata.WriteAssembly(assemblyCatalog.Assembly, this._useAssemblyIdentity);
            }

            object cacheToken = writer.WriteCache(
                this.GetType(),
                this.Parts,
                metadata,
                AttributedComposablePartCatalogSite.CreateForWriting(false));

            writer.WriteRootCacheToken(cacheToken);
            return cacheToken;
        }