code: @Override
  	public void serializeCache() {
  		final String sourceMethod = "serializeCache"; //$NON-NLS-1$
  
  		// Queue up the serialization behind any pending cache file creations.
  		Future<Void> future = _aggregator.getExecutors().getFileCreateExecutor().submit(new Callable<Void>() {
  			public Void call() {
  				// Synchronize on the cache object to keep the scheduled cache sync thread and
  				// the thread processing servlet destroy from colliding.
  				synchronized(cacheSerializerSyncObj) {
  					File cacheFile = new File(_directory, CACHE_META_FILENAME);
  					File controlFile = new File(new File(_directory, ".."), CacheControl.CONTROL_SERIALIZATION_FILENAME); //$NON-NLS-1$
  					try {
  						// Serialize the cache
  						ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(cacheFile));
  						os.writeObject(_cache.get());
  						os.close();
  						// Serialize the control object to the parent directory so the
  						// aggregator can manage the cache primer
  						os = new ObjectOutputStream(new FileOutputStream(controlFile));
  						os.writeObject(_cache.get().getControlObj());
  						os.close();
  					} catch(Exception e) {
  						throw new RuntimeException(e);
  					}
  				}
  				return null;
  			}
  		});
  
  		// Wait for the serialization to complete before returning.
  		try {
  			SignalUtil.get(future, sourceClass, sourceMethod);
  		} catch (Exception e) {
  			if (log.isLoggable(Level.SEVERE))
  				log.log(Level.SEVERE, e.getMessage(), e);
  			throw new RuntimeException(e);
  		}
  	}
docs: Serializes the specified cache object to the sepecified directory.  Note that we
  actually serialize a clone of the specified cache because some of the objects
  that are serialized require synchronization and we don't want to cause service
  threads to block while we are doing file I/O.