这是我第一次进行(反)序列化和 我的代码无法序列化(或可能由于反序列化),我的逻辑是:当我打开程序时,构造函数从文本文件中读取以前保存的值。这就是为什么我将反序列化放在这里。每当更改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() {
}
答案 0 :(得分:1)
您的FormatJson
方法不能完全完成任何事情,有两个原因(我可以看到。)
FormatJson
的两个地方,您都将完全忽略返回的字符串,并且永远不要将其分配给字符串变量。您至少可以做一个小改动就开始获得结果。在已注释的//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);
}