Danny96 Ответов: 1

C# сериализует и десериализует значения конструктора класса с помощью JSON


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

1)В этом коде у меня есть кнопка, которая изменяет значения флага на true,
Но ... основной класс не видит измененные значения флага.

Тем не менее, старые значения записываются в txt-файл.

2) мой объект "f2" не используется, это нормально?

[JsonObject(MemberSerialization.OptIn)]
   class Class1
   {
       public bool flag;
       public bool flag2;
       public Class1()
       {
           flag = false;
           flag2 = false;
       }
   }


[Serializable]
    [JsonObject(MemberSerialization.OptIn)]
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
            
        }
        Class1 c1 = new Class1();

        private void Button1_Click(object sender, EventArgs e)
        {
            c1.flag = true;
            c1.flag2 = true;
            Console.WriteLine("Flag changed: " + c1.flag);
            Console.WriteLine("Flag2 changed: " + c1.flag2);
        }


static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            Class1 c1 = new Class1();
           
            Console.WriteLine("Flag changed: " + c1.flag);
            Console.WriteLine("Flag2 changed: " + c1.flag2);

            string json = JsonConvert.SerializeObject(c1);
          
            Console.WriteLine(json);
            File.WriteAllText("path.txt", json);
            
            string json2 = File.ReadAllText("path.txt");
            Form1 f2 = JsonConvert.DeserializeObject<Form1>(json2);
            Console.WriteLine(json2);

        }


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

[JsonObject(MemberSerialization.OptIn)] предлагается, но это не сработало

Dominic Burford

Каковы эти значения до того, как вы запишете их в файл? Являются ли они правильными или неправильными в этот момент?

Danny96

Как вы можете видеть в Class1, они установлены в false, когда я нажимаю кнопку, они установлены в true, но основная функция не видит изменений, записывает false в txt-файл.

1 Ответов

Рейтинг:
8

OriginalGriff

JSON не сериализует поля - он только сериализует свойства, поэтому MemberSerialization.OptIn это ничего не изменит.
Измените свой класс:

public class Class1
    {
    public bool flag { get; set; }
    public bool flag2 { get; set; }
    public Class1()
        {
        flag = false;
        flag2 = false;
        }
    }
И отбросьте атрибут - вы получите немного лучший результат (но не намного лучше, так как вы всегда сериализуете новый экземпляр Class1, чтобы он всегда сохранялся false значения: вам нужно сериализовать экземпляр внутри вашей формы, а не вне ее).


Danny96

да, это сработало, мне это понравилось
//////////////////////////////////////////////
С1.флаг = истина;
строка json = JsonConvert.SerializeObject(c1.flag);
Файл.WriteAllText("path.txt", json);

С1.флаг2 = истина;
tring json2 = JsonConvert.SerializeObject(c1.flag2);
Файл.WriteAllText("path.txt", json2);
//////////////////////////////////////////////
Всякий раз, когда я делаю флаг true, я сериализую его, но в txt-файле он показывает только 1 true,для каждого флага должно быть 2 trues, таких как {true, true}

OriginalGriff

Что вы ожидали, что он будет содержать, когда вы передаете ему только одно значение bool для сериализации?
Вы не сериализуете в JSON отдельные значения, вы сериализуете весь экземпляр класса!
Попробуй:

c1.Flag = true;
c1.flag2 = true;
string json = JsonConvert.SerializeObject(c1);


и посмотрите, что получится!

Danny96

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

OriginalGriff

Всегда пожалуйста!