将json字符串保存到txt文件时的序列化问题

时间:2019-07-25 08:08:06

标签: c# json serialization deserialization

这是我第一次进行(反)序列化和 我的代码无法序列化(或可能由于反序列化),我的逻辑是:当我打开程序时,构造函数从文本文件中读取以前保存的值。这就是为什么我将反序列化放在这里。每当更改bool值时,我都会立即对其进行序列化。

我阅读了其他问题,这就是为什么我要以这种方式进行反序列化。

我检查了问题是否源于File.WriteAllText(path_combined,json); ,如果文件存在,它将覆盖,这不会造成问题。

我当前的txt文件显示bool变量设置为false,并且不会更改。

  

这是我的UI类,在其中执行(反序列化)

[Serializable]
public partial class UI: Form {

    string input = Interaction.InputBox("Enter a serial number", "TEST", "Default", -1, -1);
    //DEFAULT PATH ROOT
    String root = @".\\";
    string path_combined;

    FlagClass obj;
    public UI() {

        InitializeComponent();
        obj = new FlagClass();
        foreach(string s in SerialPort.GetPortNames()) {
            cbxPort.Items.Add(s);
            cbxPort.SelectedIndex = 0;
        }
        input += ".txt";
        //default path + new filename
        path_combined = Path.Combine(root, input);

        if (!File.Exists(path_combined)) {

            using(var stream = File.Create(path_combined)) {
                //if (new FileInfo(path_combined).Length > 0)

                //flag situation
                string json2 = File.ReadAllText(path_combined);
                FormatJson(json2);
                obj = JsonConvert.DeserializeObject < FlagClass > (json2);
            }

        }
        else {
            //flag situation
            string json2 = File.ReadAllText(path_combined);
            FormatJson(json2);
            obj = JsonConvert.DeserializeObject < FlagClass > (json2);

        }
    }

    private static string FormatJson(string json) {
        dynamic parsedJson = JsonConvert.DeserializeObject(json);
        return JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
    }
    void Serialize() {
        string json = JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings {
            NullValueHandling = NullValueHandling.Ignore
        });
        File.WriteAllText(path_combined, json);
    }

    private void btn_test1_Click(object sender, EventArgs e) {
        obj.flag = true;
        Serialize();
    }

}

  

这是我下面的标志类:

[Serializable]
class FlagClass {
    //command flags

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

    public FlagClass() {

}

1 个答案:

答案 0 :(得分:1)

您的FormatJson方法不能完全完成任何事情,有两个原因(我可以看到。)

  1. 在调用FormatJson的两个地方,您都将完全忽略返回的字符串,并且永远不要将其分配给字符串变量。
  2. 您实际上只是在反序列化然后重新序列化,然后稍后再反序列化。没有真正的原因。

您至少可以做一个小改动就开始获得结果。在已注释的//flag situation代码块中,您可以简单地实例化一个string变量并为其分配返回值FormatJson。然后,将其反序列化为您的FlagClass对象。

if (!File.Exists(path_combined)) {
    using(var stream = File.Create(path_combined)) {
        //flag situation
        string json2 = File.ReadAllText(path_combined);
        string FormattedJson = FormatJson(json2);
        obj = JsonConvert.DeserializeObject < FlagClass > (FormattedJson);
    }
}
else {
    //flag situation
    string json2 = File.ReadAllText(path_combined);
    string FormattedJson = FormatJson(json2);
    obj = JsonConvert.DeserializeObject < FlagClass > (FormattedJson);
}