C# JSON静态属性序列化不工作

C# JSON静态属性序列化不工作,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我知道为什么静态变量的序列化在默认情况下不起作用,但的答案似乎表明使用正确的属性是可能的 我的班级是这样的: [JsonObject(MemberSerialization.OptIn)] public class c { [JsonProperty] public static double x{ get; set; } = 70; [JsonProperty] public static double y{ get; set; } = 36; [Jso

我知道为什么静态变量的序列化在默认情况下不起作用,但的答案似乎表明使用正确的属性是可能的

我的班级是这样的:

[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;
}
它通过

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, "\t"))
        {

            serializer.WriteObject(writer, o);
            writer.Flush();
        }
    }
}
我尝试过使用[JsonObject(MemberSerialization.OptIn)]属性和不使用[JsonObject(MemberSerialization.OptIn)]属性,无论哪种方式,我都得到一个只包含“{}”的文件


通过代码,我知道对象正在被实例化,并且它被传递到具有正确信息的正确对象中。

您使用的是Json.Net属性,但没有使用Json.Net序列化程序。是.Net Framework的一部分,而不是,因此它不支持
[JsonObject]
[JsonProperty]
属性。此外,
DataContractJsonSerializer
不支持序列化静态成员,即使您使用了正确的属性(
[DataContract]
[DataMember]
)。如果要序列化静态成员,则需要使用Json.Net

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);
}
小提琴:

注意:如果您的JSON很小,您实际上不需要创建一个流。您可以将代码简化为:

string json = JsonConvert.SerializeObject(o);
File.WriteAllText(savePath, json, Encoding.UTF8);

为什么你有静态属性呢?为什么不让它们变成非静态的呢?出于同样的原因,任何人都会使用静态变量。我们需要从代码中的任何地方访问变量,不需要有超过一次的实例,传递单个实例将是混乱的,并且可能会导致很多错误。从任何地方对这些属性所做的任何更改都需要在整个程序中进行同步。这很有效,我只是调用了我们创建的遗留方法。新版本是更新到JSON.net的版本,运行良好。我们导出的数据通常也相当大。我只是为这篇文章提供了一个子样本。