public void load(string filename)
        {
            m_entries.Clear();
            FileStream     stream = new FileStream(filename, FileMode.Open);
            BEBinaryReader reader = new BEBinaryReader(stream, Encoding.UTF8);

            // Read data header
            uint file_size    = reader.ReadUInt32();
            uint table_offset = reader.ReadUInt32() + HEADER_SIZE;

            reader.ReadUInt32();
            uint num_entries = reader.ReadUInt32();

            reader.ReadUInt32();
            reader.ReadUInt32();
            reader.ReadUInt32();
            reader.ReadUInt32();

            // Read entries
            for (uint i = 0; i < num_entries; ++i)
            {
                // Read table entry
                stream.Position = table_offset + i * ENTRY_SIZE;
                uint data_offset   = reader.ReadUInt32() + HEADER_SIZE;
                uint string_offset = reader.ReadUInt32() + table_offset + num_entries * ENTRY_SIZE;

                // Read data string
                StringBuilder builder = new StringBuilder();
                stream.Position = string_offset;
                char c;
                while ((c = reader.ReadChar()) != '\0')
                {
                    builder.Append(c);
                }

                // Read data entry
                stream.Position = data_offset;
                T data = new T();
                data.load(reader);

                m_entries.Add(builder.ToString(), data);
            }

            reader.Close();
            stream.Close();
        }