【问题标题】:Serialize and deserialize a class constructor values with JSON使用 JSON 序列化和反序列化类构造函数值
【发布时间】: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()); 中的 Form1Form1 f = new Form1(); 不同(假设您购买了两辆 Toyota Corollas - 100% 相同汽车。它们仍然是不同的汽车。如果您撞到一辆,另一辆仍然可以 - 好吧,除非您将一辆撞到另一辆,但这与类比无关)。此外,Application.Run(...) 将阻塞,直到第一个 Form1 关闭。至于你的问题,我可能建议不要序列化表单本身,而是有一个你序列化的数据对象。
  • 但是它运行的是GUI,我不能改变它,你有什么建议?
  • @BB 我的意思是为什么使用new JavaScriptSerializer().Serialize(f); 而不是JsonConvert.SerializeObject(f);。我不知道它是否有什么不同,但使用同一个类进行序列化和反序列化可能是个好主意

标签: c# json serialization deserialization


【解决方案1】:

您的代码尝试序列化大量信息(它尝试序列化Form 类的成员)。您应该调用JsonConvert.SerializeObject(f),并使用opt-in serialization,这样您就可以轻松控制哪些成员被序列化。

【讨论】:

  • 我在编辑的代码中使用了该方法,但是它没有更新 txt 文件中的值,我认为存在通信问题。它应该已将标志的新值正确写入 txt
  • 您是否还使用了选择加入序列化并使用 [JsonProperty] 属性标记要序列化的成员?
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 2013-07-12
  • 1970-01-01
  • 2011-05-16
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多