JSON静态属性序列化不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON静态属性序列化不起作用相关的知识,希望对你有一定的参考价值。
我知道为什么静态变量的序列化默认不起作用,但是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.net
StatePersister.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, " "))
{
serializer.WriteObject(writer, o);
writer.Flush();
}
}
}
我已尝试使用和不使用[JsonObject(MemberSerialization.OptIn)]属性,无论哪种方式,我得到一个只包含“{}”的文件
单步执行代码我知道对象正在实例化,并且正在使用正确的信息传递给正确的对象。
您正在使用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);
以上是关于JSON静态属性序列化不起作用的主要内容,如果未能解决你的问题,请参考以下文章
来自活动xml的片段中的findViewById属性不起作用[重复]
Spring Boot REST 服务:JSON 反序列化不起作用
.NET 6 的 System.Text.Json 源代码生成不起作用