    # 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