Danny96 Ответов: 1

Сериализация и десериализация с помощью записи JSON в файл “.txt” проблема


РЕДАКТИРОВАТЬ:
Я исправляю предыдущие ошибки,
Я понимаю, что моя проблема с кодом связана с написанием пустого файла; когда я нажимаю свою кнопку, чтобы установить значения для записи файла;
Он говорит, что мой объект "С1" пуст.

System.NullReferenceException: 'Object reference not set to an instance of an object.'


на этой строке так как я нажимаю эту кнопку:
c1.flag = true


Мой файл пуст, Я знаю, кнопки сделаны, чтобы заполнить мой текст, когда я нажимаю их. Какое это имеет отношение к c1, это просто объект для обеспечения связи с моим другим классом.

-Я создаю новый файл с заданным путем, а затем записываю объект json в пустой txt.

Что я уже пробовал:

[Serializable]

    public partial class Form1 : Form
    {
        
        //FILENAME
        string input = Interaction.InputBox("Enter a serial number", "TEST", "Default", -1, -1);
        //DEFAULT PATH ROOT
        String root = @"C:\Users\Dell\source\repos\SaveReloadDeneme\SaveReloadDeneme\bin\Debug";

        Class1 c1 = new Class1();//holds method's attribute flags
        Class1 c2 = new Class1(); //holds method flags whether the used or not

        string path_combined;
        public Form1()
        {
            InitializeComponent();
            input += ".txt";
            //default path + new filename
            path_combined = Path.Combine(root, input);


            if (!File.Exists(path_combined))
            {
                File.Create(path_combined);
                
            }


            //flag situation
            string json2 = File.ReadAllText(path_combined);
            FormatJson(json2);
            c1 = JsonConvert.DeserializeObject<Class1>(json2);
            

            //Method used or not
            string json = File.ReadAllText(path_combined);
            FormatJson(json);
            c2 = JsonConvert.DeserializeObject<Class1>(json);

        }

        private static string FormatJson(string json)
        {
            dynamic parsedJson = JsonConvert.DeserializeObject(json);
            return JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
        }

        // SET TRUE
        private void Button1_Click(object sender, EventArgs e)
        {

            c1.flag = true;
            c1.flag2 = true;
            c2.M1 = true;
            string json = JsonConvert.SerializeObject(c1, Formatting.Indented);
            File.WriteAllText(path_combined, json);

            string json2 = JsonConvert.SerializeObject(c2, Formatting.Indented);
            File.WriteAllText(path_combined, json2);

        }


[Serializable]
    
    class Class1
    {
        [JsonProperty(PropertyName = "flag")]
        public bool flag { get; set; }


        [JsonProperty(PropertyName = "flag2")]
        public bool flag2 { get; set; }

        //indication whether the method is used or not
        [JsonProperty(PropertyName = "SET TRUE USED")]
        public bool M1 { get; set; }

        [JsonProperty(PropertyName = "SET FALSE USED")]
        public bool M2 { get; set; }
        public Class1()
        {
           
        }
    }

Richard MacCutchan

Вы создаете новый ArrayList и List<string>, а затем попробуйте использовать их содержимое. Но так как оба они являются новыми объектами, они ничего не содержат.

Danny96

Я упростил свой код, избавился от всех вещей arraylist, теперь это более понятно. Но у меня есть ошибка в той же строке, она говорит, что доступ запрещен, я не знаю, почему

Richard MacCutchan

Посмотрите на строку, которая была создана с полным путем к файлу, чтобы понять, почему она недопустима. Возможно, вы забыли добавить расширение .txt для имени файла, возможно, имя файла не существует, возможно, оно содержит недопустимый символ и т. д. Пожалуйста, попробуйте выполнить базовую отладку самостоятельно.

Danny96

Я обновил свой код, понял, что забыл поставить расширение .txt, кстати имя файла не существует, потому что я хочу создать новый файл с таким именем

Richard MacCutchan

Ну, вы не можете file.readalltext(path_combined); на файл, который не существует.

Я бы посоветовал вам прекратить кодирование и начать с листа бумаги и записать в логическом порядке то, что вы пытаетесь сделать. В нынешнем виде это выглядит так, как будто вы просто бросаете заявления и надеетесь, что что-то сработает.

Danny96

да, вы правы, я проследил свой код, исправил свои ошибки, но у меня возникли трудности с (де)сериализацией, я обновил свой пост, я думаю, что теперь он более точен

Richard MacCutchan

Нет смысла говорить "Я думаю, что теперь это более точно" Вам нужно показать нам точный код, который вы запускаете, и точно объяснить, какая проблема у вас возникает и где она возникает. Если проблема связана с данными, которые вы обрабатываете, то нам также нужно увидеть эти данные.

Danny96

Я только что загрузил весь код и указал строку ошибки

Richard MacCutchan

Вы все еще пытаетесь десериализоваться из файла, который не содержит никаких данных. Вы не можете создать новый файл и сразу же ожидать, что прочитаете из него какую-то полезную информацию.

Я отсылаю вас к моему предыдущему предложению: перестаньте просто разбрасывать случайные строки кода и ожидать, что что-то сработает. Начните с самого начала:
1. получите имя файла.
2. Если файл существует, то попробуйте прочитать его содержимое.
2а. убедитесь, что вы действительно прочитали некоторые достоверные данные
3. Если файл не существует, то создайте новый файл.
3а. не пытайтесь читать из него, он будет пустым

Danny96

Я решил ее :))))) большое вам спасибо

BillWoodruff

жаль, что я не могу проголосовать за комментарии !

Richard MacCutchan

Ни один законопроект не волнует. Я все еще ценю ваши комментарии.

1 Ответов

Рейтинг:
0

OriginalGriff

Цитата:
Но у меня есть ошибка в той же строке, она говорит, что доступ запрещен, я не знаю, почему

Отказ в доступе довольно очевиден: пользователь, под которым выполняется код, не имеет прав на файл или папку, которые он пытается открыть.

Вы не можете исправить это; это особенность ОС, и единственный способ изменить ее-либо использовать ОС для предоставления доступа к файлу / папке, либо (лучше) хранить ваши файлы в более подходящем месте.

Честно говоря, жесткое кодирование ваших путей-это плохая идея для начала; жесткое кодирование их для конкретного пользователя и папки только для отладки-это действительно плохая идея! Достаточно плохо использовать путь EXE (который тривиально получить во время выполнения), потому что это приведет к сбою в производстве, но жестко закодировать папку, которую вы действительно не хотите даже существовать на клиентском компьютере, просто глупо.

Видеть здесь: Где я должен хранить свои данные?[^] для некоторых лучших идей.