【发布时间】:2019-07-18 06:17:30
【问题描述】:
编辑: 我终于设法写入文件并解决了错误,但是它没有更新布尔值,我的意思是我在程序运行时更改了标志值,但它没有更改值。
主类看不到标志的变化。
我想保存并重新加载类布尔变量,我尝试使用 JSON 将变量写入和读取到 txt 文件。但是,代码既不会创建 txt 文件,也不会写入其中。
(我有一个改变标志值的按钮)
我很困惑,我不知道该怎么办。你能帮我么?
using Newtonsoft.Json; using System.Web.Script.Serialization;
编辑代码
[Serializable]
[JsonObject(MemberSerialization.OptIn)]
class Class1
{
public bool flag;
public bool flag2;
public Class1()
{
flag = false;
flag2 = false;
}
}
[Serializable]
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);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Class1 c1 = new Class1();
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);
【问题讨论】:
-
为什么不使用
JsonConvert.SerializeObject()?您正在使用 DeserializeObject -
它先序列化然后反序列化,以便读取和写入文件
-
不能解决您的问题,但有一些值得注意的地方:
Application.Run(new Form1());中的Form1与Form1 f = new Form1();不同(假设您购买了两辆 Toyota Corollas - 100% 相同汽车。它们仍然是不同的汽车。如果您撞到一辆,另一辆仍然可以 - 好吧,除非您将一辆撞到另一辆,但这与类比无关)。此外,Application.Run(...)将阻塞,直到第一个Form1关闭。至于你的问题,我可能建议不要序列化表单本身,而是有一个你序列化的数据对象。 -
但是它运行的是GUI,我不能改变它,你有什么建议?
-
@BB 我的意思是为什么使用
new JavaScriptSerializer().Serialize(f);而不是JsonConvert.SerializeObject(f);。我不知道它是否有什么不同,但使用同一个类进行序列化和反序列化可能是个好主意
标签: c# json serialization deserialization