# File lib/rubygems/source_info_cache.rb, line 204
  def read_cache_data(file)
    # Marshal loads 30-40% faster from a String, and 2MB on 20061116 is small
    data = open file, 'rb' do |fp| fp.read end
    cache_data = Marshal.load data

    cache_data.each do |url, sice|
      next unless sice.is_a?(Hash)
      update

      cache = sice['cache']
      size  = sice['size']

      if cache.is_a?(Gem::SourceIndex) and size.is_a?(Numeric) then
        new_sice = Gem::SourceInfoCacheEntry.new cache, size
        cache_data[url] = new_sice
      else # irreperable, force refetch.
        reset_cache_for url, cache_data
      end
    end

    cache_data
  rescue Errno::ENOENT
    {}
  rescue => e
    if Gem.configuration.really_verbose then
      say "Exception during cache_data handling: #{e.class} - #{e}"
      say "Cache file was: #{file}"
      say "\t#{e.backtrace.join "\n\t"}"
    end

    {}
  end