JSON静态属性序列化不起作用

问题描述 投票:1回答:1

我知道为什么静态变量的序列化默认不起作用,但是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, "\t"))
        {

            serializer.WriteObject(writer, o);
            writer.Flush();
        }
    }
}

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

单步执行代码我知道对象正在实例化,并且正在使用正确的信息传递给正确的对象。

c# json serialization json.net
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.