public static void DeserializeConfig(MemoryConfig config, string filePath) { using (var file = File.OpenRead(filePath)) using (var reader = new BinaryReader(file)) { if (file.Length == 0) { throw new IOException("'" + filePath + "' is an empty file."); } if (!IsFileValid(reader.ReadInt64())) { throw new IOException("'" + filePath + "' is not a valid '.mcfg' file."); } DataGroup currentGroup = null; string currentEntryName = null; byte expectedTokens = (byte)Token.GROUP_NAME; while (reader.PeekChar() != END_OF_FILE) { var token = reader.ReadByte(); if ((expectedTokens & token) == 0) { throw new IOException("Failed to read '" + filePath + "'! Invalid Token!"); } switch ((Token)token) { case Token.ENTRY_VALUE: byte type = reader.ReadByte(); switch (type) { case (byte)Types.INT32: currentGroup.AddEntry(currentEntryName, reader.ReadInt32()); break; case (byte)Types.STRING: currentGroup.AddEntry(currentEntryName, reader.ReadString()); break; default: throw new IOException("Failed to read '" + filePath + "'! Unknown Value Type: " + type); } expectedTokens = (byte)Token.ENTRY_NAME | (byte)Token.GROUP_NAME; break; case Token.ENTRY_NAME: currentEntryName = reader.ReadString(); expectedTokens = (byte)Token.ENTRY_VALUE; break; case Token.GROUP_NAME: string groupName = reader.ReadString(); config.AddGroup(groupName); currentGroup = config.GetGroup(groupName); expectedTokens = (byte)Token.ENTRY_NAME | (byte)Token.GROUP_NAME; break; } } } }