«Указанное приведение неверно» с сериализацией - PullRequest
1 голос
/ 29 апреля 2020

Я делаю случайный математический консольный проект, который задает пользователю сложение, вычитание, умножение, деление, деление и квадрат- root вопросы!

Я пытаюсь сделать код более сложным, сказав пользователь получает оценку, полученную в последний раз при запуске теста, и сообщает, какую трудность выбрать.

Однако при выполнении кода появляется ошибка «Указанное приведение недействительно».

Вот часть моего кода, где происходит ошибка:

[Serializable]
public class ToFile
{
    public int TotalScore { get; private set; }
    public int NumberOfQuestions { get; }
    public UserDifficulty UserDifficulty { get; }
    public ToFile(int numberOfQuestions, UserDifficulty userDifficulty)
    {
        NumberOfQuestions = numberOfQuestions;
        UserDifficulty = userDifficulty;
    }
    public static void Serialize()
    {
        var (userDifficulty, numberOfQuestions) = UserInputs();
        ToFile obj = new ToFile(numberOfQuestions, userDifficulty);
        _ = obj.NumberOfQuestions;
        _ = obj.UserDifficulty;
        _ = obj.TotalScore;
        Stream stream = new FileStream("Example.txt", FileMode.Create, FileAccess.Write);
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, obj);
        stream.Close();
    }
    public static void Deserialize()
    {
        Stream stream = new FileStream("Example.txt", FileMode.Open, FileAccess.Read);
        BinaryFormatter formatter = new BinaryFormatter();
        ToFile objnew = (ToFile)formatter.Deserialize(stream);
        stream.Close();
        Console.WriteLine($"Last time you did the test on {objnew.UserDifficulty} level and got {objnew.TotalScore}/{objnew.NumberOfQuestions}");

        double decimalScore = (double)objnew.TotalScore / (double)objnew.NumberOfQuestions;

        if (objnew.UserDifficulty == UserDifficulty.Easy)
        {
            if (decimalScore <= 0.7)
            {
                Console.WriteLine($"You should stay on Easy difficulty");
            }
            else
            {
                Console.WriteLine($"Easy difficulty seems to easy for you! You should go up to Normal difficulty");
            }
        }
        else if (objnew.UserDifficulty == UserDifficulty.Normal)
        {
            if (decimalScore <= 0.3)
            {
                Console.WriteLine($"Normal difficulty seems to be to hard for you:( You should go down to Easy difficulty");
            }
            else if ((decimalScore > 0.3) && (decimalScore <= 0.7))
            {
                Console.WriteLine($"You should stay on Normal difficulty");
            }
            else
            {
                Console.WriteLine($"Normal difficulty seems to easy for you! You should go up to Hard difficulty");
            }
        }
        else if (objnew.UserDifficulty == UserDifficulty.Hard)
        {
            if (decimalScore <= 0.3)
            {
                Console.WriteLine($"Hard difficulty seems to hard for you:( You should go down to Normal difficulty");
            }
            else if ((decimalScore > 0.3) && (decimalScore <= 0.8))
            {
                Console.WriteLine($"You should stay on Hard difficulty");
            }
            else
            {
                Console.WriteLine($"You are a maths Genius! Sadly this is the hardest level");
            }
        }
        Console.ReadKey();
        Console.Write(Environment.NewLine);
    }
}

public static void Main(string[] args)
    {
        ToFile.Deserialize();
        ToFile.Serialize();
    }

Вот мой полный код: https://github.com/CrazyDanyal1414/mathstester/blob/master/Program.cs

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 30 апреля 2020

Я получаю сообщение об ошибке «Указанное преобразование недействительно» при запуске кода.

Я пробовал ваш код из github, и он работал для меня. Я подозреваю, что ваш файл Examples.txt с последним выбором пользователя содержит недопустимые данные, поэтому вы получаете сообщение об ошибке при попытке десериализации содержащихся в нем данных. Попробуйте удалить файл, а затем создайте его снова. Я думаю, что это решит проблему.


Мой код в настоящий момент выполняет мою функцию UserInputs дважды. Не могли бы вы помочь мне исправить это?

Проблема в том, что вы вызываете его дважды:

  • первый раз - внутри метода Main перед вызовом метода ToFile.Serialize;
  • во второй раз - внутренний метод ToFile.Serialize.

Чтобы решить эту проблему, вы должны переписать свой код в Main:

ToFile.Deserialize();
var (userDifficulty, numberOfQuestions) = UserInputs();
OperationQuestionScore score = RunTest(numberOfQuestions, userDifficulty);
// 1. You should serialize data after running a test, because property
//    ToFile.TotalScore can be filled only after test.
// 2. Now we pass into method Serialize three parameters: numberOfQuestions,
//    score.TotalScore and userDifficulty.
ToFile.Serialize(numberOfQuestions, score.TotalScore, userDifficulty);

и внести следующие изменения к методу ToFile.Serialize:

public static void Serialize(int numberOfQuestions, int totalScore, UserDifficulty userDifficulty)
{
    // Now you can delete this line, because user input comes from method parameters.
    // var (userDifficulty, numberOfQuestions) = UserInputs();

    // And then serialize values: numberOfQuestions, totalScore, userDifficulty.
    ...
}
...