예제 #1
0
            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;
                            }
                        }
                    }
            }