我知道为什么默认情况下静态变量的序列化不起作用,但this question的答案似乎表明可以使用正确的属性。
我的班级看起来像这样:
[JsonObject(MemberSerialization.OptIn)]
public class c
{
[JsonProperty]
public static double x{ get; set; } = 70;
[JsonProperty]
public static double y{ get; set; } = 36;
[JsonProperty]
public static double z{ get; set; } = 12;
}
它通过
进入JSON.netStatePersister.SaveState(new c(), fileName);
public static void SaveState(Object o, string savePath, FileFormat? format = null)
{
DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
DataContractJsonSerializer serializer = new DataContractJsonSerializer(o.GetType(), settings);
using (var stream = File.Create(savePath))
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "\t"))
{
serializer.WriteObject(writer, o);
writer.Flush();
}
}
}
我尝试使用和不使用[JsonObject(MemberSerialization.OptIn)]属性,无论哪种方式我都得到一个只包含“{}”的文件
单步执行代码,我知道对象正在被实例化,并且正在使用正确的信息传递给正确的对象。
答案 0 :(得分:2)
您正在使用Json.Net属性,但您没有使用Json.Net序列化程序。 DataContractJsonSerializer
是.Net Framework的一部分,而不是Json.Net,因此它不会尊重[JsonObject]
和[JsonProperty]
属性。此外,DataContractJsonSerializer
不支持序列化静态成员,即使您确实使用了正确的属性(分别为[DataContract]
和[DataMember]
)。如果要序列化静态成员,则需要使用Json.Net的JsonSerializer
。
using (var stream = File.Create(savePath))
using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8))
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(jsonWriter, o);
}
小提琴:https://dotnetfiddle.net/lYzDEE
注意:如果你的JSON很小,你真的不需要一个流。您可以将代码简化为:
string json = JsonConvert.SerializeObject(o);
File.WriteAllText(savePath, json, Encoding.UTF8);